如何根据现有地图中的值创建新地图

时间:2018-12-20 01:05:02

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

具有下一张原始地图:

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())

任何帮助,将不胜感激。

1 个答案:

答案 0 :(得分:2)

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

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

注意 e -> Collections.max(e.getValue())

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

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