具有下一张原始地图:
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())
任何帮助,将不胜感激。
答案 0 :(得分:2)
toMap使用keyMapper
和valueMapper
的函数。您为代码中的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()));