Java 8中如何将List<V>转换为Map<K, V>,使用Function函数。

4

我尝试遵循Java 8 List转Map的方法,并尝试将一个列表中的Set更改为Map

而不是循环(虽然可以工作)

for (Type t : toSet()) {
    map.put(Pair.of(t, Boolean.TRUE), this::methodAcceptingMap);
}

我尝试了以下解决方案:

toSet().stream()
       .collect(Collectors.toMap(Pair.of(Function.identity(), Boolean.TRUE), 
                                 this::methodAcceptingMap));

但是在转换时出现了错误:

Type mismatch: cannot convert from Pair<Function<Object,Object>,Boolean> 
to Function<? super T,? extends K>

我的地图

private Map<Pair<Type, Boolean>, BiConsumer<Pair<Type, Boolean>, Parameters>> map =
      new HashMap<>();

你能分享一下 methodAcceptingMap 的签名吗? - ernest_k
@ernest_k 我认为现在方法不重要,但这里是 private void methodAcceptingMap(Pair<Type, Boolean> pair, Parameters parameters) - user7294900
2个回答

6

Collectors.toMap需要两个函数,但你提供的参数都不符合条件。

你应该使用:

Map<Pair<Type, Boolean>, BiConsumer<Pair<Type, Boolean>, Parameters>> map =
    set.stream()
       .collect(Collectors.toMap(el -> Pair.of(el, Boolean.TRUE), 
                                 el -> this::methodAcceptingMap));

表达式Pair.of(t, Boolean.TRUE)并不是一个Function类型。而this::methodAcceptingMap可以符合BiConsumer的签名,但该方法需要一个Function。因此,el -> this::methodAcceptingMap应该被用作一个函数,它接受流元素并返回您的BiConsumer
请注意,在这种情况下,赋值上下文(map =)非常重要。如果没有它,这些lambda表达式的目标类型将会丢失,编译将失败。

1
我不太理解你的例子。在 for 循环中,您为每个值传递相同的 lambda 表达式。我认为这没有意义。如果您真的想要这样做,您需要传递 obj -> (pair, param) -> this.methodAcceptingMap(pair, param)
toSet().stream().collect(Collectors.toMap(
    obj -> Pair.of(obj, Boolean.TRUE), 
    obj -> (pair, param) -> this.methodAcceptingMap(pair, param)));

.collect(Collectors.toMap(el -> Pair.of(el, Boolean.TRUE), el -> this::methodAcceptingMap));。而我的早期评论是:“如果你用方法引用替换(pair, param) -> this.methodAcceptingMap(pair, param),即:this::methodAcceptingMap”。 - Andronicus
仍然无法工作,需要更改为 el -> this::methodAcceptingMap - user7294900
有一个参数...我要求更改 (pair, param) -> this.methodAcceptingMap(pair, param),而不是 obj -> (pair, param) -> this.methodAcceptingMap(pair, param) - Andronicus
所以最终 obj -> this::methodAcceptingMap - Andronicus
@user7294900,这是什么意思?我不明白... Lambda参数的名称并不重要。我写的是obj -> Pair.of(obj, Boolean.TRUE),你说应该是el -> Pair.of(el, Boolean.TRUE),对吗? - Andronicus
显示剩余9条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接