一、概述
Collector是专门用来作为Stream的collect方法的参数的。
public interface Stream extends BaseStream> {
R collect(Collector super T, A, R> collector);
}
而Collectors是作为生产具体Collector的工具类。
二、Collector
Collector主要包含五个参数,它的行为也是由这五个参数来定义的,如下所示:
public interface Collector {
// supplier参数用于生成结果容器,容器类型为A
Supplier supplier();
// accumulator用于消费元素,也就是归纳元素,这里的T就是元素,它会将流中的元素一个一个与结果容器A发生操作
BiConsumer accumulator();
// combiner用于两个两个合并并行执行的线程的执行结果,将其合并为一个最终结果A
BinaryOperator combiner();
// finisher用于将之前整合完的结果R转换成为A
Function finisher();
// characteristics表示当前Collector的特征值,这是个不可变Set
Set characteristics();
}
Collector拥有两个of方法用于生成Collector实例,其中一个拥有上面所有五个参数,另一个四个参数,不包括finisher。
public interface Collector {
// 四参方法,用于生成一个Collector,T代表流中的一个一个元素,R代表最终的结果
public static Collector of(Supplier supplier,
BiConsumer accumulator,
BinaryOperator combiner,
Characteristics... characteristics) {/*...*/}
// 五参方法,用于生成一个Collector,T代表流中的一个一个元素,A代表中间结果,R代表最终结果,finisher用于将A转换为R
public static Collector of(Supplier supplier,
BiConsumer accumulator,
BinaryOperator combiner,
Function finisher,
Characteristics... characteristics) {/*...*/}
}
Characteristics:这个特征值是一个枚举,拥有三个值:CONCURRENT(多线程并行),UNORDERED(无序),IDENTITY_FINISH(无需转换结果)。其中四参of方法中没有finisher参数,所有必有IDENTITY_FINISH特征值。
三、Collectors
Collectors是一个工具类,是JDK预实现Collector的工具类,它内部提供了多种Collector,我们可以直接拿来使用,非常方便。
5.6.1 toCollection
将流中的元素全部放置到一个集合中返回,这里使用Collection,泛指多种集合。
public class CollectorsTest {
public static void toCollectionTest(List list) {
List ll = list.stream().collect(Collectors.toCollection(LinkedList::new));
}
public static void main(String[] args) {
List list = Arrays.asList("123","456","789","1101","212121121","asdaa","3e3e3e","2321eew");
toCollectionTest(list);
}
}
5.6.2 toList
将流中的元素放置到一个列表集合中去。这个列表默认为ArrayList。
public class CollectorsTest {
public static void toListTest(List list) {
List ll = list.stream().collect(Collectors.toList());
}
public static void main(String[] args) {
List list = Arrays.asList("123","456","789","1101","212121121","asdaa","3e3e3e","2321eew");
toListTest(list);
}
}
5.6.3 toSet
将流中的元素放置到一个无序集set中去。默认为HashSet。
public class CollectorsTest {
public static void toSetTest(List list) {
Set ss = list.stream().collect(Collectors.toSet());
}
public static void main(String[] args) {
List list = Arrays.asList("123","456","789","1101","212121121","asdaa","3e3e3e","2321eew");
toSetTest(list);
}
}
5.6.4 joining
joining的目的是将流中的元素全部以字符序列的方式连接到一起,可以指定连接符,甚至是结果的前后缀。
public class CollectorsTest {
public static void joiningTest(Lis