Java Groupby在8中的统计排序
在Java 8中,GroupBy
这是一个非常强大的操作,它可以根据指定的条件对集合元素进行分组,并对每个组进行统计和排序。该功能对数据分析和报告生成非常有用。
在Java 8中,可使用Collectors.groupingBy
分组操作的方法。这种方法可以接受一个Function
该类型的参数用于指定根据哪个属性或条件进行分组。以下是如何根据课堂组合学生的示例:
List<Student> students = Arrays.asList( new Student("Alice", 10, "Class A"), new Student("Bob", 12, "Class B"), new Student("Charlie", 11, "Class A"), new Student("David", 11, "Class B"));Map<String, List<Student>> groupedStudents = students.stream() .collect(Collectors.groupingBy(Student::getClassroom));System.out.println(groupedStudents);
这个例子,Student
类有三个属性:name
、age
和classroom
。我们根据classroom
属性将学生分组,并将结果存储在一个组中Map
对象。输出结果如下:
{Class A=[Student{name='Alice', age=10, classroom='Class A'}, Student{name='Charlie', age=11, classroom='Class A'}], Class B=[Student{name='Bob', age=12, classroom='Class B'}, Student{name='David', age=11, classroom='Class B'}]}
由此可见,学生按班级正确分组。
分组后的统计和排序除了分组,Java 8还提供了一些统计和排序每个组的操作。
统计每组元素的数量我们能用Collectors.counting
统计每组元素数量的方法。以下是如何统计每个班中学生数量的示例:
Map<String, Long> studentCountByClassroom = students.stream() .collect(Collectors.groupingBy(Student::getClassroom, Collectors.counting()));System.out.println(studentCountByClassroom);
输出结果如下:
{Class A=2, Class B=2}
可以看出,每个班的学生数量都是正确统计的。
各组元素属性的和平均值、最大值和最小值除了统计数量,我们还可以使用它Collectors.summingInt
、Collectors.averagingInt
、Collectors.maxBy
和Collectors.minBy
统计求和、平均值、最大值和最小值的方法。
以下是如何统计各班中学生年龄总和、平均年龄、最大年龄和最小年龄的示例:
Map<String, Integer> totalAgeByClassroom = students.stream() .collect(Collectors.groupingBy(Student::getClassroom, Collectors.summingInt(Student::getAge)));Map<String, Double> averageAgeByClassroom = students.stream() .collect(Collectors.groupingBy(Student::getClassroom, Collectors.averagingInt(Student::getAge)));Map<String, Optional<Student>> maxAgeByClassroom = students.stream() .collect(Collectors.groupingBy(Student::getClassroom, Collectors.maxBy(Comparator.comparingInt(Student::getAge))));Map<String, Optional<Student>> minAgeByClassroom = students.stream() .collect(Collectors.groupingBy(Student::getClassroom, Collectors.minBy(Comparator.comparingInt(Student::getAge))));System.out.println(totalAgeByClassroom);System.out.println(averageAgeByClassroom);System.out.println(maxAgeByClassroom);System.out.println(minAgeByClassroom);
输出结果如下:
{Class A=21, Class B=23}{Class A=10.5, Class B=11.5}{Class A=Optional[Student{name='Charlie', age=11, classroom='Class A'}], Class B=Optional[Student{name='Bob', age=12, classroom='Class B'}]}{Class A=Optional[Student{name='Alice', age=10, classroom='Class A'}], Class B=Optional[Student{name='David', age=11, classroom='Class B'}]}
可以看出,每个班学生年龄的总和、平均值、最大值和最小值都是