使用 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() 调用合并到收集器中即可。