具有功能的Java 8 List <V>到Map <K,V>

时间:2019-12-15 07:21:05

标签: java java-8

我试图遵循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<>();

2 个答案:

答案 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)));