📅  最后修改于: 2023-12-03 14:42:42.576000             🧑  作者: Mango
Java 8 引入了一个名为 maxBy
的收集器,该收集器使用指定的比较器比较对象,然后返回拥有指定属性中最大值的对象,或者如果最值不存在,则返回 null
。
该收集器是一个终止操作,可用于 Stream
对象。
Optional<T> maxBy(Comparator<? super T> comparator)
该方法接收一个 Comparator
对象,用于比较 Stream
中的元素。返回一个 Optional
对象,表示符合指定条件的最大元素。如果流为空,则返回空的 Optional
对象。
假设有一个列表,其中包含了若干个学生的成绩信息:
List<Student> studentList = Arrays.asList(
new Student("Tom", 90),
new Student("Jerry", 80),
new Student("Alice", 95),
new Student("Bob", 75)
);
要求找出成绩最高的学生,可以使用 maxBy
收集器:
Optional<Student> topStudent = studentList.stream()
.collect(Collectors.maxBy(Comparator.comparing(Student::getScore)));
if (topStudent.isPresent()) {
System.out.println("成绩最高的学生是:" + topStudent.get().getName());
}
运行结果如下:
成绩最高的学生是:Alice
在上面的例子中,使用了 Comparator.comparing
方法创建了一个比较器对象,用于比较 Student
对象的成绩属性。maxBy
收集器返回一个 Optional<Student>
对象,表示拥有最高成绩的学生,然后可以使用 Optional.isPresent()
方法判断是否有找到符合条件的学生,再使用 Optional.get()
方法取出学生对象,进一步操作该对象的属性。
maxBy
收集器是一个简单但非常实用的收集器,它可以用于查找最值,而无需手动维护迭代过程中的最大/最小值。使用 Comparator
比较器来定义排序规则,使得该收集器适用于不同的排序需求。