JAVA研发狄仁杰 5万字:Stream和Lambda表达式最佳实践2( 三 )


输出结果:22:22:35.238[main]INFOcom.flydean.CollectorUsage-IntSummaryStatistics{count=4,sum=16,min=3,average=4.000000,max=5}复制代码9.9Collectors.averagingDouble/Long/Int()
averagingDouble/Long/Int()对stream中的元素做平均:DoubleaverageResult=list.stream().collect(Collectors.averagingInt(String::length));log.info("{}",averageResult);复制代码9.10Collectors.summingDouble/Long/Int()
summingDouble/Long/Int()对stream中的元素做sum操作:DoublesummingResult=list.stream().collect(Collectors.summingDouble(String::length));log.info("{}",summingResult);复制代码9.11Collectors.maxBy()/minBy()
maxBy()/minBy()根据提供的Comparator , 返回stream中的最大或者最小值:Optional
maxByResult=list.stream().collect(Collectors.maxBy(Comparator.naturalOrder()));log.info("{}",maxByResult);复制代码9.12Collectors.groupingBy()
GroupingBy根据某些属性进行分组 , 并返回一个Map:Map>groupByResult=list.stream().collect(Collectors.groupingBy(String::length,Collectors.toSet()));log.info("{}",groupByResult);复制代码9.13Collectors.partitioningBy()
PartitioningBy是一个特别的groupingBy , PartitioningBy返回一个Map , 这个Map是以boolean值为key , 从而将stream分成两部分 , 一部分是匹配PartitioningBy条件的 , 一部分是不满足条件的:Map>partitionResult=list.stream().collect(Collectors.partitioningBy(s->s.length()>3));log.info("{}",partitionResult);复制代码
看下运行结果:22:39:37.082[main]INFOcom.flydean.CollectorUsage-{false=[bob],true=[jack,alice,mark]}复制代码
结果被分成了两部分 。 10.创建一个自定义的collector
在之前的javacollectors文章里面 , 我们讲到了stream的collect方法可以调用Collectors里面的toList()或者toMap()方法 , 将结果转换为特定的集合类 。
今天我们介绍一下怎么自定义一个Collector 。 10.1Collector介绍
我们先看一下Collector的定义:
JAVA研发狄仁杰 5万字:Stream和Lambda表达式最佳实践2
文章图片
Collector接口需要实现supplier(),accumulator(),combiner(),finisher(),characteristics()这5个接口 。
同时Collector也提供了两个静态of方法来方便我们创建一个Collector实例 。
我们可以看到两个方法的参数跟Collector接口需要实现的接口是一一对应的 。
下面分别解释一下这几个参数:supplier
Supplier是一个函数 , 用来创建一个新的可变的集合 。 换句话说Supplier用来创建一个初始的集合 。 accumulator
accumulator定义了累加器 , 用来将原始元素添加到集合中 。 combiner
combiner用来将两个集合合并成一个 。 finisher
finisher将集合转换为最终的集合类型 。 characteristics
characteristics表示该集合的特征 。 这个不是必须的参数 。
Collector定义了三个参数类型 , T是输入元素的类型 , A是reductionoperation的累加类型也就是Supplier的初始类型 , R是最终的返回类型 。 我们画个图来看一下这些类型之间的转换关系:
JAVA研发狄仁杰 5万字:Stream和Lambda表达式最佳实践2
文章图片
有了这几个参数 , 我们接下来看看怎么使用这些参数来构造一个自定义Collector 。 10.2自定义Collector
我们利用Collector的of方法来创建一个不变的Set:publicstaticCollector,Set
toImmutableSet(){returnCollector.of(HashSet::new,Set::add,(left,right)->{left.addAll(right);returnleft;},Collections::unmodifiableSet);}复制代码


推荐阅读