Java 流:获取按内部映射键分组的值
Java Streams: get values grouped by inner map key
我有 Map<A, Map<B, C>>
,我想使用 Java 流从中获取 Map<B, List<C>>
。
我尝试这样做:
public <A, B, C> Map<B, List<C>> groupsByInnerKey(Map<A, Map<B, C>> input) {
return input.values()
.stream()
.flatMap(it -> it.entrySet().stream())
.collect(Collectors.groupingBy(Map.Entry::getKey));
}
我的期望:
flatMap
给出 Stream
的 Map.Entry<B, C>
collect(Collectors.groupingBy(...))
接受应用于 Map.Entry<B, C>
和 returns B
的函数,因此它将 C
的值收集到 List<C>
中。
但它没有编译,字面意思是:
Non-static method cannot be referenced from a static context
在最后一行的 Map.Entry::getKey
。
有人可以解释什么是错的,或者什么是实现我想要的东西的正确方法?
您的流管道 returns Map<B, List<Map.Entry<B,C>>>
,而不是 Map<B, List<C>>
。
要获得 Map<B, List<C>>
,您需要添加一个 mapping
将 Map.Entry<B,C>
映射到 C
:
return input.entrySet()
.stream()
.flatMap(it -> it.getValue().entrySet().stream())
.collect(Collectors.groupingBy(Map.Entry::getKey,Collectors.mapping(Map.Entry::getValue,Collectors.toList())));
您的 Stream 由 Map.Entry
个对象组成,但您要收集的实际上是条目的值,而不是条目本身。使用您当前的代码,您将获得 Map<B, List<Map.Entry<B, C>>>
.
因此,您只是错过了对 Collectors.mapping
的调用。此收集器将使用给定的映射器函数映射 Stream 元素,并将该结果收集到下游容器中。在这种情况下,映射器是 Map.Entry::getValue
(因此从映射条目返回值)并且下游收集器收集到 List
.
public <A, B, C> Map<B, List<C>> groupsByInnerKey(Map<A, Map<B, C>> input) {
return input.values()
.stream()
.flatMap(it -> it.entrySet().stream())
.collect(Collectors.groupingBy(
Map.Entry::getKey,
Collectors.mapping(Map.Entry::getValue, Collectors.toList())
));
}
我有 Map<A, Map<B, C>>
,我想使用 Java 流从中获取 Map<B, List<C>>
。
我尝试这样做:
public <A, B, C> Map<B, List<C>> groupsByInnerKey(Map<A, Map<B, C>> input) {
return input.values()
.stream()
.flatMap(it -> it.entrySet().stream())
.collect(Collectors.groupingBy(Map.Entry::getKey));
}
我的期望:
flatMap
给出Stream
的Map.Entry<B, C>
collect(Collectors.groupingBy(...))
接受应用于Map.Entry<B, C>
和 returnsB
的函数,因此它将C
的值收集到List<C>
中。
但它没有编译,字面意思是:
Non-static method cannot be referenced from a static context
在最后一行的 Map.Entry::getKey
。
有人可以解释什么是错的,或者什么是实现我想要的东西的正确方法?
您的流管道 returns Map<B, List<Map.Entry<B,C>>>
,而不是 Map<B, List<C>>
。
要获得 Map<B, List<C>>
,您需要添加一个 mapping
将 Map.Entry<B,C>
映射到 C
:
return input.entrySet()
.stream()
.flatMap(it -> it.getValue().entrySet().stream())
.collect(Collectors.groupingBy(Map.Entry::getKey,Collectors.mapping(Map.Entry::getValue,Collectors.toList())));
您的 Stream 由 Map.Entry
个对象组成,但您要收集的实际上是条目的值,而不是条目本身。使用您当前的代码,您将获得 Map<B, List<Map.Entry<B, C>>>
.
因此,您只是错过了对 Collectors.mapping
的调用。此收集器将使用给定的映射器函数映射 Stream 元素,并将该结果收集到下游容器中。在这种情况下,映射器是 Map.Entry::getValue
(因此从映射条目返回值)并且下游收集器收集到 List
.
public <A, B, C> Map<B, List<C>> groupsByInnerKey(Map<A, Map<B, C>> input) {
return input.values()
.stream()
.flatMap(it -> it.entrySet().stream())
.collect(Collectors.groupingBy(
Map.Entry::getKey,
Collectors.mapping(Map.Entry::getValue, Collectors.toList())
));
}