collectors 求和_Java基础系列-Collector和Collectors

一、概述

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值