技术编程5万字:Stream和Lambda表达式最佳实践2( 三 )


输出结果:22:22:35.238 [main] INFO com.flydean.CollectorUsage - IntSummaryStatistics{count=4, sum=16, min=3, average=4.000000, max=5}复制代码9.9 Collectors.averagingDouble/Long/Int()
averagingDouble/Long/Int()对stream中的元素做平均:Double averageResult = list.stream().collect(Collectors.averagingInt(String::length));log.info("{}",averageResult);复制代码9.10 Collectors.summingDouble/Long/Int()
summingDouble/Long/Int()对stream中的元素做sum操作:Double summingResult = list.stream().collect(Collectors.summingDouble(String::length));log.info("{}",summingResult);复制代码9.11 Collectors.maxBy()/minBy()
maxBy()/minBy()根据提供的Comparator , 返回stream中的最大或者最小值:Optional
maxByResult = list.stream().collect(Collectors.maxBy(Comparator.naturalOrder()));log.info("{}",maxByResult);复制代码9.12 Collectors.groupingBy()
GroupingBy根据某些属性进行分组 , 并返回一个Map:Map
> groupByResult = list.stream().collect(Collectors.groupingBy(String::length, Collectors.toSet()));log.info("{}",groupByResult);复制代码9.13 Collectors.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] INFO com.flydean.CollectorUsage - {false=[bob], true=[jack, alice, mark]}复制代码
结果被分成了两部分 。 10. 创建一个自定义的collector
在之前的java collectors文章里面 , 我们讲到了stream的collect方法可以调用Collectors里面的toList()或者toMap()方法 , 将结果转换为特定的集合类 。
今天我们介绍一下怎么自定义一个Collector 。 10.1 Collector介绍
我们先看一下Collector的定义:
技术编程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是reduction operation的累加类型也就是Supplier的初始类型 , R是最终的返回类型 。我们画个图来看一下这些类型之间的转换关系:
技术编程5万字:Stream和Lambda表达式最佳实践2
本文插图
有了这几个参数 , 我们接下来看看怎么使用这些参数来构造一个自定义Collector 。 10.2 自定义Collector
我们利用Collector的of方法来创建一个不变的Set:public staticCollector, Set