优雅的将一个对象的集合转化成另一个对象的集合
1 |
|
交集 (list1 + list2)
1 |
|
差集
1 |
|
并集
1 |
|
去重并集
1 |
|
从List中过滤出一个元素
1 |
|
Map集合转 List
1 |
|
Collectors toList
1 |
|
Collectors toMap
1 |
|
List集合转 Map
1 |
|
List 转 Map<Integer,Apple>
1 |
|
List 转 List<Map<String,Object»
1 |
|
字典查询和数据转换 toMap时,如果value为null,会报空指针异常
解决办法一:
1 |
|
解决办法二:
1 |
|
解决办法三:
1 |
|
解决办法四:
1 |
|
假设有一个User实体类,有方法getId(),getName(),getAge()等方法,现在想要将User类型的流收集到一个Map中,示例如下:
1 |
|
假设要得到按年龄分组的Map<Integer,List>,可以按这样写:
1 |
|
Map 转 另一个Map
1 |
|
List
1 |
|
Collectors toSet
1 |
|
排序
1 |
|
比较
1 |
|
Collectors groupingBy 分组
1 |
|
对集合按照多个属性分组
将多个字段拼接成一个新字段,然后再使用groupBy分组
1 |
|
groupingBy 分组后操作
//Collectors中还提供了一些对分组后的元素进行downStream处理的方法:
//counting方法返回所收集元素的总数;
//summing方法会对元素求和;
//maxBy和minBy会接受一个比较器,求最大值,最小值;
//mapping函数会应用到downstream结果上,并需要和其他函数配合使用;
1 |
|
groupingBy 根据年龄来分组:
1 |
|
groupingBy 根据年龄分组,年龄对应的键值List存储的为Person的姓名:
1 |
|
groupingBy 根据姓名分组,获取每个姓名下人的年龄总和:
1 |
|
groupingBy Boolean分组:
1 |
|
groupingBy 按年龄分组
1 |
|
Map.merge() 类似于分组之后sum
1 |
|
Collectors partitioningBy
Collectors中还提供了partitioningBy方法,接受一个Predicate函数,该函数返回boolean值,用于将内容分为两组。假设User实体中包含性别信息getSex(),可以按如下写法将userStream按性别分组:
1 |
|
可以看到Java8的分组功能相当强大,当然你还可以完成更复杂的功能。另外Collectors中还存在一个类似groupingBy的方法:partitioningBy,它们的区别是partitioningBy为键值为Boolean类型的groupingBy,这种情况下它比groupingBy更有效率。
partitioningBy 将数字的Stream分解成奇数集合和偶数集合。
1 |
|
Collectors joining
Collectors.joining 收集Stream中的值,该方法可以方便地将Stream得到一个字符串。joining函数接受三个参数,分别表示允(用以分隔元素)、前缀和后缀:
1 |
|
组合 Collectors:
1 |
|
Collectors分别提供了求平均值averaging、总数couting、最小值minBy、最大值maxBy、求和suming等操作。但是假如你希望将流中结果聚合为一个总和、平均值、最大值、最小值,那么Collectors.summarizing(Int/Long/Double)就是为你准备的,它可以一次行获取前面的所有结果,其返回值为(Int/Long/Double)SummaryStatistics。
1 |
|
使用collect可以将Stream转换成值。maxBy和minBy允许用户按照某个特定的顺序生成一个值。
averagingDouble:求平均值,Stream的元素类型为double
averagingInt:求平均值,Stream的元素类型为int
averagingLong:求平均值,Stream的元素类型为long
counting:Stream的元素个数
maxBy:在指定条件下的,Stream的最大元素
minBy:在指定条件下的,Stream的最小元素
reducing: reduce操作
summarizingDouble:统计Stream的数据(double)状态,其中包括count,min,max,sum和平均。
summarizingInt:统计Stream的数据(int)状态,其中包括count,min,max,sum和平均。
summarizingLong:统计Stream的数据(long)状态,其中包括count,min,max,sum和平均。
summingDouble:求和,Stream的元素类型为double
summingInt:求和,Stream的元素类型为int
summingLong:求和,Stream的元素类型为long
1 |
|
Collectors averagingInt
计算集合的平均年龄
1 |
|
自定义 Collector
1 |
|
![20181129134929981.png][1] [1]: https://xtboke.cn/upload/2019/11/4099920483.png