1.引子
groupingBy
方法有多个重载方法,但是根本上只有一个方法。之所以提供这么多方法的重载,主要目的还是为了开发者调用方便。通过对于此分组静态方法的学习,我们可以更好地了解Java在收集器collector
接口实现上的设计模式以及设计思想。
2.源码分析
CodeBlock-1:
public static <T, K> Collector<T, ?, Map<K, List<T>>>
groupingBy(Function<? super T, ? extends K> classifier) {
return groupingBy(classifier, toList());
}
这是groupingBy
方法的重载版本之一,实际上其调用了重载版本2的代码块,即 CodeBlock-2: 其输入参数只有分类器接口的实例,所以中间容器被默认限制为ArrayList
类型。
CodeBlock-2:
public static <T, K, A, D>
Collector<T, ?, Map<K, D>> groupingBy(Function<? super T, ? extends K> classifier,
Collector<? super T, A, D> downstream) {
return groupingBy(classifier, HashMap::new