Java Streams:获取按内部映射键分组的值

我有Map<A, Map> ,我希望使用Java Streams从中获取Map<B, List>

我尝试按如下方式进行:

 public  Map<B, List> groupsByInnerKey(Map<A, Map> input) { return input.values() .stream() .flatMap(it -> it.entrySet().stream()) .collect(Collectors.groupingBy(Map.Entry::getKey)); } 

我期待的是:

  • flatMap给出Map.Entry
  • collect(Collectors.groupingBy(...))获取应用于Map.Entry函数并返回B ,因此它将C值收集到List

但它没有编译,字面意思:

无法从静态上下文引用非静态方法

在最后一行的Map.Entry::getKey中。

有人可以解释什么是错的或什么是实现我想要的正确方法?

您的Stream由Map.Entry对象组成,但是您希望收集的实际上是条目的值,而不是条目本身。 使用当前代码,您将获得Map>>

因此,您只是错过了对Collectors.mapping的调用。 此收集器将使用给定的映射器函数映射Stream元素,并将该结果收集到下游容器中。 在这种情况下,映射器是Map.Entry::getValue (因此返回映射条目中的值),下游收集器收集到List

 public  Map> groupsByInnerKey(Map> input) { return input.values() .stream() .flatMap(it -> it.entrySet().stream()) .collect(Collectors.groupingBy( Map.Entry::getKey, Collectors.mapping(Map.Entry::getValue, Collectors.toList()) )); } 

您的流管道返回Map>> ,而不是Map>

要获得Map> ,您需要添加一个mapping ,将Map.Entry mappingC

 return input.entrySet() .stream() .flatMap(it -> it.getValue().entrySet().stream()) .collect(Collectors.groupingBy(Map.Entry::getKey,Collectors.mapping(Map.Entry::getValue,Collectors.toList())));