前文提到,JDK 默认提供了不少的收集器。本文将给出各种收集器的使用样例。
show me the code
先定义初始值
1 | private Stream<String> getStrStream() { |
1 | public void collectorTest() { |
输出如下:
Collectors.toCollection 转成 ArrayList 结果:[this, is, the, the, test, null]
Collectors.toList 结果:[this, is, the, the, test, null]
Collectors.toSet 去重后结果:[this, is, the, the, test, null]
Collectors.toMap 默认 HashMap 乱序结果:{null=0, the=3, test=4, this=4, is=2}
Collectors.toMap LinkedHashMap 有序结果:{this=4, is=2, the=3, test=4, null=0}
Collectors.toConcurrentMap 结果:{the=3, test=4, null=0, this=4, is=2}
Collectors.counting 计数结果:6
Collectors.joining 无分隔符结果:thisisthethetestnull
Collectors.joining 有分隔符结果:this,is,the,the,test,null
Collectors.joining 有分隔符和左右护法结果:[this,is,the,the,test,null]
Collectors.minBy 结果:is
Collectors.maxBy 结果:this
Collectors.reducing 结果: this is the the test null
Collectors.averagingInt 平均值结果:3.3333333333333335
Collectors.summarizingInt 结果:IntSummaryStatistics{count=6, sum=20, min=2, average=3.333333, max=4}
Collectors.collectingAndThen 先转List再取size 结果:6
Collectors.mapping 结果:[this, is, the, the, test, null]
Collectors.groupingBy 按字母个数分组结果:{2=[is], 3=[the, the], 4=[this, test, null]}
Collectors.groupingBy 按字母个数分组,分组统计个数,结果:{2=1, 3=2, 4=3}
Collectors.groupingBy 按字母个数分组,分组统计个数,存放在LinkedHashMap结果:{4=3, 2=1, 3=2}
Collectors.groupingByConcurrent 按字母个数分组结果:{2=[is], 3=[the, the], 4=[this, test, null]}
Collectors.partitioningBy 按字母长度分块,结果:{false=[is, the, the], true=[this, test, null]}
Collectors.partitioningBy 按字母个数分块并统计结果:{false=3, true=3}
总结
- Collectors 提供的部分收集器,其实使用部分终止操作方法更简单。
- Collectors 提供的收集器,基础上可以满足我们日常的编码需求,如果有特殊情况,可以直接使用 collect 方法传普通参数。
- 部分收集器,组合起来使用,效果更好。
- 收集器的使用,还是要多练习才能更好的掌握。