java8stream操作:将集合根据元素的某个属性分组求统计数据

student类:

public class Student {

    private int id;
    private String name;
    private int score;

    public Student(int id, String name, int score) {
        this.id = id;
        this.name = name;
        this.score = score;
    }
get...
set...
}

求统计数据:

        List students = new ArrayList<>();

        students.add(new Student(1,"张三",90));
        students.add(new Student(1,"张三",83));
        students.add(new Student(1,"张三",79));
        students.add(new Student(2,"李四",60));
        students.add(new Student(3,"王五",30));
        students.add(new Student(3,"王五",70));
        students.add(new Student(3,"王五",75));
        students.add(new Student(4,"赵六",60));
        students.add(new Student(4,"赵六",85));
        
        Map collect = students.stream().collect(Collectors.groupingBy(Student::getId, Collectors.summarizingInt(Student::getScore)));
        System.out.println(collect);

上面代码根据id求score的统计数据(求和,个数,平均数,最大最小值),结果如下:

{1=IntSummaryStatistics{count=3, sum=252, min=79, average=84.000000, max=90}, 2=IntSummaryStatistics{count=1, sum=60, min=60, average=60.000000, max=60}, 3=IntSummaryStatistics{count=3, sum=175, min=30, average=58.333333, max=75}, 4=IntSummaryStatistics{count=2, sum=145, min=60, average=72.500000, max=85}}

也可以只求和:

        Map collect1 = students.stream().collect(Collectors.groupingBy(Student::getId, Collectors.summingInt(Student::getScore)));

运行结果

{1=252, 2=60, 3=175, 4=145}

你可能感兴趣的:(java,代码库)