我试图遵循Java 8 List into 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<>();
答案 0 :(得分:5)
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 :(得分: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)));