• Java8用Stream流一行代码实现数据分组统计,排序,最大值、最小值、平均值、总数、合计


    Java8对数据处理可谓十分流畅,既不改变数据,又能对数据进行很好的处理,今天给大家演示下,用Java8的Stream如何对数据进行分组统计,排序,求和等

    汇总统计方法

    找到汇总统计的方法。这些方法属于java 8的汇总统计类。
    getAverage(): 它返回所有接受值的平均值。
    getCount(): 它计算所有元素的总数。
    getMax(): 它返回最大值。
    getMin(): 它返回最小值。
    getSum(): 它返回所有元素的总和。

    示例:统计用户status的最大值,最小值,求和,平均值

    看官可以根据自己的需求进行灵活变通

    1. @GetMapping("/list")
    2. public void list(){
    3. List<InputForm> inputForms = inputFormMapper.selectList();
    4. Map<String, IntSummaryStatistics> collect = inputForms.stream()
    5. .collect(Collectors.groupingBy(InputForm::getCreateUserName, Collectors.summarizingInt(InputForm::getStatus)));
    6. // 对名字去重
    7. Set<String> collect1 = inputForms.stream().distinct().map(InputForm::getCreateUserName).collect(Collectors.toSet());
    8. // 遍历名字,从map中取出对应用户的status最大值,最小值,平均值。。。
    9. for (String s1 : collect1) {
    10. IntSummaryStatistics statistics1 = collect.get(s1);
    11. System.out.println("第一个用户的名字为====" + s1);
    12. System.out.println("**********************************************");
    13. System.out.println("status的个数为===" + statistics1.getCount());
    14. System.out.println("status的最小值为===" + statistics1.getMin());
    15. System.out.println("status的求和为===" + statistics1.getSum());
    16. System.out.println("status的平均值为===" + statistics1.getAverage());
    17. System.out.println();
    18. System.out.println();
    19. }
    20. }

      结果如下:

    分组统计:

    1. @GetMapping("/list")
    2. public void list(){
    3. List<InputForm> inputForms = inputFormMapper.selectList();
    4. System.out.println("inputForms = " + inputForms);
    5. Map<String, Long> collect = inputForms.stream().collect(Collectors.groupingBy(InputForm::getCreateUserName,
    6. Collectors.counting()));
    7. System.out.println("collect = " + collect);
    8. }

    其中Collectors.groupingBy(InputForm::getCreateUserName, Collectors.counting())返回的是一个Map集合,InputForm::getCreateUserName代表key,Collectors.counting()代表value,我是按照创建人的姓名进行统计

     
    

    可以看到总共有九条数据,其中莫昀锦有两个,周亚丽有七个

    如果我们想看某个部门下面有哪些数据,可以如下代码

    1. @GetMapping("/list")
    2. public Map<String, List<InputForm>> list(){
    3. List<InputForm> inputForms = inputFormMapper.selectList();
    4. System.out.println("inputForms = " + inputForms);
    5. Map<String, List<InputForm>> collect = inputForms.stream()
    6. .collect(Collectors.groupingBy(InputForm::getCreateCompanyName));
    7. return collect;
    8. }

     求最大值,最小值

    1. @GetMapping("/list")
    2. public Map<String, List<InputForm>> list(){
    3. List<InputForm> inputForms = inputFormMapper.selectList();
    4. System.out.println("inputForms = " + inputForms);
    5. Optional<InputForm> min = inputForms.stream()
    6. .min(Comparator.comparing(InputForm::getId));
    7. System.out.println("min = " + min);
    8. return null;
    9. }

    可以看到此id是最小的,最大值雷同

    对某个字段求最大,最小,求和,统计,计数

    1. @GetMapping("/list")
    2. public void list(){
    3. List<InputForm> inputForms = inputFormMapper.selectList();
    4. System.out.println("inputForms = " + inputForms);
    5. IntSummaryStatistics collect = inputForms.stream()
    6. .collect(Collectors.summarizingInt(InputForm::getStatus));
    7. double average = collect.getAverage();
    8. int max = collect.getMax();
    9. int min = collect.getMin();
    10. long sum = collect.getSum();
    11. long count = collect.getCount();
    12. System.out.println("collect = " + collect);
    13. }

    求最大值,最小值还可以这样做

    1. // 求最大值
    2. Optional max = inputForms.stream().max(Comparator.comparing(InputForm::getAgency));
    3. if (max.isPresent()){
    4. System.out.println("max = " + max);
    5. }
    6. // 求最小值
    7. Optional min = inputForms.stream().min(Comparator.comparing(InputForm::getAgency));
    8. if (min.isPresent()){
    9. System.out.println("min = " + min);
    10. }

    对某个字段求和并汇总

    1. int sum = inputForms.stream().mapToInt(InputForm::getStatus).sum();
    2. System.out.println("sum = " + sum);

    求某个字段的平均值

    1. // 求某个字段的平均值
    2. Double collect2 = inputForms.stream().collect(Collectors.averagingInt(InputForm::getStatus));
    3. System.out.println("collect2 = " + collect2);
    4. // 简化后
    5. OptionalDouble average = inputForms.stream().mapToDouble(InputForm::getStatus).average();
    6. if (average.isPresent()){
    7. System.out.println("average = " + average);
    8. }

    拼接某个字段的值,可以设置前缀,后缀或者分隔符

    1. // 拼接某个字段的值,用逗号分隔,并设置前缀和后缀
    2. String collect3 = inputForms.stream().map(InputForm::getCreateUserName).collect(Collectors.joining(",", "我是前缀", "我是后缀"));
    3. System.out.println("collect3 = " + collect3);

    根据部门进行分组,并获取汇总人数

    1. // 根据部门进行汇总,并获取汇总人数
    2. Map collect4 = inputForms.stream().collect(Collectors.groupingBy(InputForm::getCreateDeptName, Collectors.counting()));
    3. System.out.println("collect4 = " + collect4);

    根据部门和是否退休进行分组,并汇总人数

    1. // 根据部门和是否退休进行分组,并汇总人数
    2. Map> collect5 = inputForms.stream().collect(Collectors.groupingBy(InputForm::getCreateDeptName, Collectors.groupingBy(InputForm::getIsDelete, Collectors.counting())));
    3. System.out.println("collect5 = " + collect5);

    根据部门和是否退休进行分组,并取得每组中年龄最大的人

    1. // 根据部门和是否退休进行分组,并取得每组中年龄最大的人
    2. Map> collect6 = inputForms.stream().collect(
    3. Collectors.groupingBy(InputForm::getCreateDeptName,
    4. Collectors.groupingBy(InputForm::getIsDelete,
    5. Collectors.collectingAndThen(
    6. Collectors.maxBy(
    7. Comparator.comparing(InputForm::getAge)), Optional::get))));
    8. System.out.println("collect6 = " + collect6);

  • 相关阅读:
    【占坑】Redis key设计问题
    PMP备考|通关宝典
    Linux shell的展开模式【实操演示】
    中枢神经系统的网状结构,网状神经系统的特征
    深度解析:会用Excel,还有必要学Python吗?
    从简历被拒到收割8个大厂offer,我用了3个月成功破茧成蝶
    python使用%操作符进行字符串格式化
    GhostNet网络解析
    【LeetCode每日一题】——236.二叉树的最近公共祖先
    抽象类和抽象方法
  • 原文地址:https://blog.csdn.net/xiaoheihai666/article/details/128152182