【问题标题】:Java 8 List<V> into Map<K, V> with FunctionJava 8 List<V> 到 Map<K, V> 与函数
【发布时间】:2020-04-08 01:12:07
【问题描述】:

我尝试关注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<>();

【问题讨论】:

  • 可以分享methodAcceptingMap的签名吗?
  • @ernest_k 我认为方法现在无关紧要,但这里是private void methodAcceptingMap(Pair&lt;Type, Boolean&gt; pair, Parameters parameters)

标签: java dictionary java-8 set java-stream


【解决方案1】:

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 -&gt; this::methodAcceptingMap 应该用作一个函数,它接受一个流元素并返回你的BiConsumer

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

【讨论】:

    【解决方案2】:

    我不太明白你的例子。在 for 循环中,您为每个值传递相同的 lambda。我认为这没有意义。如果你真的想要,你需要通过obj -&gt; (pair, param) -&gt; this.methodAcceptingMap(pair, param)

    toSet().stream().collect(Collectors.toMap(
        obj -> Pair.of(obj, Boolean.TRUE), 
        obj -> (pair, param) -> this.methodAcceptingMap(pair, param)));
    

    【讨论】:

    • 不同的错误The method toMap(Function&lt;? super T,? extends K&gt;, Function&lt;? super T,? extends U&gt;) in the type Collectors is not applicable for the arguments ((&lt;no type&gt; obj) -&gt; {}, this::methodAcceptingMap)
    • 我认为方法现在无关紧要,但这里是private void methodAcceptingMap(Pair&lt;Type, Boolean&gt; pair, Parameters parameters) 最后的解决方案给了我不同的错误Lambda expression's signature does not match the signature of the functional interface method apply(? super T)
    • 不同的错误Cannot infer type argument(s) for &lt;R, A&gt; collect(Collector&lt;? super T,A,R&gt;)
    • 如果你用方法引用交换(pair, param) -&gt; this.methodAcceptingMap(pair, param),即:this::methodAcceptingMap
    • 同样的错误,你能尝试重现吗?如果需要,我会尝试做一个最小的例子
    猜你喜欢
    • 2013-12-20
    • 2019-01-23
    • 2014-02-09
    • 1970-01-01
    • 2017-05-20
    • 2018-05-03
    • 1970-01-01
    • 1970-01-01
    • 2019-10-10
    相关资源
    最近更新 更多