代码之家  ›  专栏  ›  技术社区  ›  Ori Marko

Java 8 List<V>到Map<K,V>的函数

  •  2
  • Ori Marko  · 技术社区  · 5 年前

    我试着跟着 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 回复  |  直到 5 年前
        1
  •  3
  •   ernest_k Petronella    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 ,但该方法需要一个函数。所以 el -> this::methodAcceptingMap 应该用作接受流元素并返回 双消费者 .

    注意,赋值上下文( map = )在这种情况下很重要。没有它,这些lambda表达式的目标类型将丢失,编译将失败。

        2
  •  1
  •   Andronicus    5 年前

    我不太明白你的例子。在 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)));