【问题标题】:How create a new map from the values in an existing map如何从现有地图中的值创建新地图
【发布时间】:2024-04-12 03:05:01
【问题描述】:

有下一张原图:

G1=[7,8,45,6,9]
G2=[3,9,34,2,1,65]
G3=[6,5,9,1,67,5]

其中 G1、G2 和 G3 是人群的年龄组,我怎样才能创建这样的新地图:

45=[7,8,45,6,9]
65=[3,9,34,2,1,65]
67=[6,5,9,1,67,5]

其中新键是每个组中的最大年龄。

我试过这个:

Map<Integer, List<Integer>> newMap = originalMap.entrySet().stream()
                .collect(Collectors.toMap(Collections.max(x -> x.getValue()), x -> x.getValue()));

但是编译器在这段代码中告诉我:“这个表达式的目标类型必须是一个函数式接口”:

Collections.max(x -> x.getValue())

我们将不胜感激。

【问题讨论】:

    标签: java collections java-8 java-stream functional-interface


    【解决方案1】:

    toMap 使用 keyMappervalueMapper 的函数。您对代码中的 valueMapper 正确执行此操作,但对于 keyMapper 未正确执行此操作,因此您需要包含 keyMapper 函数,如下所示:

    originalMap.entrySet()
               .stream()
               .collect(toMap(e -> Collections.max(e.getValue()), Map.Entry::getValue));
    

    注意e -&gt; Collections.max(e.getValue())

    此外,由于您不使用映射键,因此您可以避免调用 entrySet() 而是使用映射值:

    originalMap.values()
               .stream()
               .collect(Collectors.toMap(Collections::max, Function.identity()));
    

    【讨论】:

      最近更新 更多