如何从现有地图中的值创建新地图
How create a new map from the values in an existing map
有下一张原图:
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()));
但是编译器告诉我:"The target type of this expression must be a functional interface" 在这段代码中:
Collections.max(x -> x.getValue())
如有任何帮助,我们将不胜感激。
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()));
有下一张原图:
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()));
但是编译器告诉我:"The target type of this expression must be a functional interface" 在这段代码中:
Collections.max(x -> x.getValue())
如有任何帮助,我们将不胜感激。
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()));