前言
在前面的文章中其实大家也已经看到我使用过collect(Collectors.toList())
将数据最后汇总成一个 List 集合。
但其实还可以转换成Integer、Map、Set 集合等。
一、查找流中的最大值和最小值
static List<Student> students = new ArrayList<>();
static {
students.add(new Student("学生A", "大学A", 18, 98.0));
students.add(new Student("学生B", "大学A", 18, 91.0));
students.add(new Student("学生C", "大学A", 18, 90.0));
students.add(new Student("学生D", "大学B", 18, 76.0));
students.add(new Student("学生E", "大学B", 18, 91.0));
students.add(new Student("学生F", "大学B", 19, 65.0));
students.add(new Student("学生G", "大学C", 20, 80.0));
students.add(new Student("学生H", "大学C", 21, 78.0));
students.add(new Student("学生I", "大学C", 20, 67.0));
students.add(new Student("学生J", "大学D", 22, 87.0));
}
public static void main(String[] args) {
Optional<Student> collect1 = students.stream().collect(Collectors.maxBy((s1, s2) -> s1.getAge() - s2.getAge()));
Optional<Student> collect2 = students.stream().collect(Collectors.minBy((s1, s2) -> s1.getAge() - s2.getAge()));
Student max = collect1.get();
Student min = collect2.get();
System.out.println("max年龄的学生==>" + max);
System.out.println("min年龄的学生==>" + min);
/**
* max年龄的学生==>Student(name=学生J, school=大学D, age=22, score=87.0)
* min年龄的学生==>Student(name=学生A, school=大学A, age=18, score=98.0)
*/
}
复制代码
Optional,它是一个容器,可以包含也可以不包含值。它是java8中人们常说的优雅的判空的操作。
另一个常见的返回单个值的归约操作是对流中对象的一个数值字段求和。或者你可能想要求 平均数。这种操作被称为汇总操作。让我们来看看如何使用收集器来表达汇总操作。
二、汇总
Collectors类专门为汇总提供了一些个工厂方法: