当前位置: 首页 > 图灵资讯 > 技术篇> java 8 grouby 分组 统计排序

java 8 grouby 分组 统计排序

来源:图灵教育
时间:2023-08-16 09:36:33

Java Groupby在8中的统计排序

在Java 8中,GroupBy这是一个非常强大的操作,它可以根据指定的条件对集合元素进行分组,并对每个组进行统计和排序。该功能对数据分析和报告生成非常有用。

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类有三个属性:nameageclassroom。我们根据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.summingIntCollectors.averagingIntCollectors.maxByCollectors.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'}]}

可以看出,每个班学生年龄的总和、平均值、最大值和最小值都是

上一篇:

io.appium.java_client.android

下一篇:

java a++