概述
在JDK8中,对Collectos类的定义:一个Collector接口的实现,并提供很多有用的方法。事实也是如此,通过Collectors提供的方法,我们可以完成大多数日常的集合运算操作。因此,Collectors类的所有方法返回都是Collector的实例。其实,Collectors使Collector更具体化。因为,Collector只是约束了一种操作运算的规范(提供容器,计算,归集,finisher得出最终结果),而Collectors则提供了各种各样的,具有具体功能的Collector。比如:toList(),、toMap、toSet()、joining()等等Collector,这些Collector都是有具体的功能的。
joining():将字符串元素拼接起来;
toSet():将操作的元素以Set集合形式输出;
toMap() :将操作元素以Map形式输出;
所以说,Collectors使Collector更加的具体化,简洁实用。
第一组:toSet、toMap、toCollectioin、toList、toConcurrentMap
这组Collector都是输出集合对象,它们的实现方式也大同小异,但是需要对Collector的实现方式很熟悉才可以很轻松看懂下面的源代码。
源代码:
public static <T, C extends Collection<T>>
Collector<T, ?, C> toCollection(Supplier<C> collectionFactory) {
return new CollectorImpl<>(collectionFactory, Collection<T>::add,
(r1, r2) -> { r1.addAll(r2); return r1; },
CH_ID);
}
public static <T>
Collector<T, ?, List<T>> toList() {
return new CollectorImpl<>((Supplier<List<T>>) ArrayList::new, List::add,
(left, right) -> { left.addAll(right); return left; },
CH_ID);
}
public static <T>
Collector<T, ?, Set<T>> toSet() {
return new CollectorImpl<>((Supplier<Set<T>>) HashSet::new, Set::add,
(left, right) -> { left.addAll(right); return left; },
CH_UNORDERED_ID);
}
从上面的代码中可以看出,toSet、toList、toCollection的实现方式都是通过创建ConllectorImpl来获得具体的Collector,创建的方式也很简单。首先创建一个集合容器;其次将元素放入集合容器中,最后进行归集操作conbiner,将多个结果集合合并为一个结果集合输出。由于输出类型与输入类型一致&#x