Collectors方法详解
Collectors方法详解
零、准备
- 本文的解释是基于JDK11版本,JDK8之后新增的方法会标识出来。
- Collectors类是- java.util.stream下的类,主要作用就是对流的处理,需要明确一点的是该类的方法与stream类中有一些方法作用相同,比如说- stream.count()和- stream.collect(Collectors.counting())。这里相同的两个方法使用场景不同:比如说当你想分组时计数则就需要用到- Collectors.counting()方法了。
- 我们创建两个用于演示的集合list和stuList。
| 1 | class Student{ | 
一、计算操作
1.求平均数
- Collectors.averagingDouble();
- Collectors.averagingLong();
- Collectors.averagingInt();
| 1 | //将String转成Double求平均数 | 
2.求总和
- Collectors.summingInt();
- Collectors.summingLong();
- Collectors.summingDouble();
| 1 | Integer res7 = list.stream().collect(Collectors.summingInt(Integer::parseInt)); | 
3.求个数
- Collectors.counting();- 用于统计流中元素的个数。(因为在流的处理中会对集合的元素个数有影响,当流没结束时,直接获取集合size会出现问题) 
 不过他返回的类型是- Long
| 1 | Long res2 = list.stream().collect(Collectors.counting()); | 
4.求最大最小值
- Collectors.maxBy();
- Collectors.minBy();
 接受一个比较器(比较方式)作为参数,用于计算流中所有元素的最大值和最小值。
| 1 | stuList.stream().collect(Collectors.maxBy(Comparator.comparingInt((Student o) -> o.age))); | 
5.汇总
返回一个统计对象IntSummaryStatistics,该对象里包含【平均值,最大值,总和,最小值,长度】
- Collectors.summarizingInt();
- Collectors.summarizingLong();
- Collectors.summarizingDouble();
| 1 | IntSummaryStatistics res8 = stuList.stream().collect(Collectors.summarizingInt(Student::getAge)); | 
二、处理操作
1.映射规约
- Collectors.mapping();
- Collectors.reducing();- maping方法指将一个流中的内容进行映射变换操作,- reducing方法指对流中数据进行规约处理操作。
| 1 | List<String> stuNameList = Stream.of(studentA,studentB,studentC) | 
- Collectors.collectingAndThen();- 集合先进行第一个参数 map(映射)操作,再进行第二个参数的reduce(归约)操作。 
| 1 | //下例是将数组中元素先 *2 再求平均数的一个操作。 | 
2.处理
- Collectors.joining();- 可以以顺序拼接元素。我们可以传递可选的拼接字符串、前缀和后缀。 
| 1 | String res6 = list.stream().collect(Collectors.joining("-","[","]")); | 
- Collectors.groupingBy();- 对集合进行分组操作 
| 1 | Map<String, List<Student>> res5 = stuList.stream().collect(Collectors.groupingBy(Student::getGender)); | 
- Collectors.groupingByConcurrent();
 相对于- groupingBy(),它更能满足:不要求顺序(无序),更需要并发的分组操作。
- Collectors.filtering();Java 9- Collectors.filtering()方法类似于- Stream filter()方法,后者用于过滤输入元素,但两者的使用场景不同。- Stream filter()在stream链接方法中使用,而- Collectors.filtering()方法被设计和- groupingBy一起使用。
- Collectors.flatMapping();Java9- 它允许我们处理嵌套的集合,在其中再进行流处理 
- Collectors.partitioningBy();- 是一种将流的元素始终分为两部分的方法。 
| 1 | Map<Boolean, List<Student>> stdByClass = | 
三、转化操作
1.基本转化
- Collectors.toCollection();- 返回一个Collection集合,(集合层次结构中的基类) 
- Collectors.toMap();
- Collectors.toSet();
- Collectors.toList();
2.其他
- Collectors.toConcurrentMap();- 返回一个支持并发的Map,代价则是它是无序的。 
- Collectors.toUnmodifiableList();java10
- Collectors.toUnmodifiableSet();
- Collectors.toUnmodifiableMap();- 返回一个不可变的集合,即不能对它进行增删改操作。与 - stream.toList();一样。