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

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 消耗函数,因为它是 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()));