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 9Collectors.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();java10Collectors.toUnmodifiableSet();Collectors.toUnmodifiableMap();返回一个不可变的集合,即不能对它进行增删改操作。与
stream.toList();一样。