使用Collectors.groupingBy()获取地图的价值集

时间:2015-06-02 12:24:18

标签: java java-8 grouping collectors

我想要按其类型分组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()从中提取价值集?

1 个答案:

答案 0 :(得分:3)

在内部,你仍然需要生成这样的地图。可以通过以下方式创建自定义收集器:

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