使用 Collectors.groupingBy() 获取地图的值集
Get the value-set of a map while using Collectors.groupingBy()
我有一个 Collection<A>
,我想按其类型分组。我可以通过 getType
方法获取 A 的类型。结果应为 Collection<Collection<A>>
类型。例如:
输入:[A1 ,A2, A3, A1, A3, A4]
(A1 是 '1' 类型的对象,依此类推)
输出:[[A1, A1], [A2], [A3, A3], [A4]]
这是我写的:
listOfAs.stream().collect(Collectors.groupingBy(SomeClass::getType)).values();
有没有一种方法可以直接获取生成的地图的值集,而不是生成地图然后使用 values()
从中提取值集?
在内部,您仍然需要生成这样的地图。不过可以创建自定义收集器:
public static <T, K>
Collector<T, ?, Collection<List<T>>> groups(Function<? super T, ? extends K> classifier) {
return Collectors.collectingAndThen(Collectors.groupingBy(classifier), Map::values);
}
所以你可以这样使用它:
Collection<List<SomeClass>> result = listOfAs.stream().collect(groups(SomeClass::getType));
请注意,它在内部与您的解决方案没有太大区别。您只需将 values()
调用合并到收集器中即可。
我有一个 Collection<A>
,我想按其类型分组。我可以通过 getType
方法获取 A 的类型。结果应为 Collection<Collection<A>>
类型。例如:
输入:[A1 ,A2, A3, A1, A3, A4]
(A1 是 '1' 类型的对象,依此类推)
输出:[[A1, A1], [A2], [A3, A3], [A4]]
这是我写的:
listOfAs.stream().collect(Collectors.groupingBy(SomeClass::getType)).values();
有没有一种方法可以直接获取生成的地图的值集,而不是生成地图然后使用 values()
从中提取值集?
在内部,您仍然需要生成这样的地图。不过可以创建自定义收集器:
public static <T, K>
Collector<T, ?, Collection<List<T>>> groups(Function<? super T, ? extends K> classifier) {
return Collectors.collectingAndThen(Collectors.groupingBy(classifier), Map::values);
}
所以你可以这样使用它:
Collection<List<SomeClass>> result = listOfAs.stream().collect(groups(SomeClass::getType));
请注意,它在内部与您的解决方案没有太大区别。您只需将 values()
调用合并到收集器中即可。