JAVA8 根据某个字段去重统计总数

在实际开发中,我们经常会遇到需要根据某个字段去重统计总数的情况。比如,我们有一个包含学生信息的列表,我们想要统计不同班级学生的人数。在JAVA8中,我们可以使用流(Stream)和集合框架来实现这个需求。

代码示例

下面是一个简单的示例代码,假设我们有一个Student类,包含nameclass两个字段:

import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class Main {
    public static void main(String[] args) {
        List<Student> students = Arrays.asList(
                new Student("Alice", "A"),
                new Student("Bob", "B"),
                new Student("Alice", "A"),
                new Student("Charlie", "A")
        );

        Map<String, Long> classCounts = students.stream()
                .collect(Collectors.groupingBy(Student::getClass, Collectors.counting()));

        System.out.println(classCounts);
    }

    static class Student {
        String name;
        String class;

        public Student(String name, String aClass) {
            this.name = name;
            this.class = aClass;
        }

        public String getClass() {
            return class;
        }
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.

在这段代码中,我们首先定义了一个Student类,包含nameclass字段,然后创建了一个学生信息列表students。我们使用stream方法对学生列表进行流操作,通过Collectors.groupingBy方法按照班级进行分组,然后使用Collectors.counting来统计每个班级的学生人数,最终将结果存储在classCounts中并输出。

饼状图

下面是根据统计结果生成的班级人数饼状图:

班级人数统计 67% 33% 班级人数统计 A B

状态图

为了更好地理解代码执行过程,我们可以使用状态图来表示:

对学生按班级分组 统计每个班级人数 输出结果 Init Grouping Counting Output

结论

通过上面的代码示例和解释,我们学习了如何使用JAVA8的流和集合框架来根据某个字段去重统计总数。这种方式简洁高效,能够很方便地处理类似问题。同时,通过饼状图和状态图的展示,我们更直观地了解了代码执行过程和结果。

希望本文能够帮助读者更好地理解JAVA8的流处理和集合框架,以及如何应用它们来解决实际问题。祝大家编程愉快!