在Java 8中,java.util.stream.Collectors
类提供了强大的数据流处理和归约操作,使得对集合的操作更加简洁高效。本文将通过创建一个简单的Student
类为例,来逐一介绍Collectors中常用的收集器及其使用方法。
首先,定义一个Student
类:
public class Student { private String name; private int age; private double score; // 构造方法、getter和setter省略... }
接下来,我们将使用这个Student
类作为示例,探索各种收集器的应用场景。
基础收集器
toList()
将流转换为List
。
List<Student> students = ... // 学生列表 List<Student> studentList = students.stream().collect(Collectors.toList());
toSet()
将流转换为Set
,自动去重。
Set<Student> studentSet = students.stream().collect(Collectors.toSet());
joining()
将流中的元素连接成一个字符串。
String names = students.stream() .map(Student::getName) .collect(Collectors.joining(", "));
counting()
统计流中元素的数量。
long count = students.stream().collect(Collectors.counting());
minBy() / maxBy()
找到流中最小/最大的元素。
Optional<Student> youngest = students.stream() .collect(Collectors.minBy(Comparator.comparingInt(Student::getAge))); Optional<Student> oldest = students.stream() .collect(Collectors.maxBy(Comparator.comparingInt(Student::getAge)));
summingInt(), summingLong(), summingDouble()
对流中元素的某个数值属性求和。
double totalScore = students.stream() .collect(Collectors.summingDouble(Student::getScore));
averagingInt(), averagingLong(), averagingDouble()
计算流中元素的某个数值属性的平均值。
double averageScore = students.stream() .collect(Collectors.averagingDouble(Student::getScore));
reducing()
通用的归约操作,可以实现求和、求积等多种操作。
// 求所有学生成绩之和 double sumScores = students.stream() .collect(Collectors.reducing(0.0, Student::getScore, Double::sum));
分组收集器
groupingBy()
根据某个属性进行分组。
Map<Integer, List<Student>> studentsByAge = students.stream() .collect(Collectors.groupingBy(Student::getAge));
partitioningBy()
根据条件进行分区。
Map<Boolean, List<Student>> studentsByAgePartition = students.stream() .collect(Collectors.partitioningBy(s -> s.getAge() > 18));
映射收集器
mapping()
在收集前对元素进行转换。
List<String> names = students.stream() .collect(Collectors.mapping(Student::getName, Collectors.toList()));
collectingAndThen()
先应用一个收集器,再应用一个最终转换函数。
Optional<Double> maxScore = students.stream() .collect(Collectors.collectingAndThen( Collectors.maxBy(Comparator.comparingDouble(Student::getScore)), opt -> opt.map(Student::getScore).orElse(0.0)));
以上是Collectors
中一些常用收集器的简介和示例。通过这些收集器,我们可以非常方便地对数据流进行转换、聚合、分组等操作,极大地提高了代码的简洁性和可读性。在实际开发中,合理利用这些工具能够有效提升编程效率。