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

共 10808字,需浏览 22分钟

 ·

2023-11-10 17:41





胖虎和朋友原创的视频教程有兴趣的可以看看


(文末附课程大纲)


👏2024 最新,Java成神之路,架构视频(点击查看)


😉超全技术栈的Java入门+进阶+实战!(点击查看)


来源:blog.csdn.net/xiaoheihai666/article/details/128152182






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



  • 分组统计:



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



  • 求最大值,最小值



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



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



  • 对某个字段求和并汇总



  • 求某个字段的平均值



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



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



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



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




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


这些方法属于java 8的汇总统计类:





  • getAverage(): 它返回所有接受值的平均值。



  • getCount(): 它计算所有元素的总数。



  • getMax(): 它返回最大值。



  • getMin(): 它返回最小值。



  • getSum(): 它返回所有元素的总和。


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


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


@GetMapping("/list")
public void list(){
    List<InputForm> inputForms = inputFormMapper.selectList();
    Map<String, IntSummaryStatistics> collect = inputForms.stream()
        .collect(Collectors.groupingBy(InputForm::getCreateUserName, Collectors.summarizingInt(InputForm::getStatus)));

    // 对名字去重
    Set<String> collect1 = inputForms.stream().distinct().map(InputForm::getCreateUserName).collect(Collectors.toSet());

    // 遍历名字,从map中取出对应用户的status最大值,最小值,平均值。。。
    for (String s1 : collect1) {
        IntSummaryStatistics statistics1 = collect.get(s1);

        System.out.println("第一个用户的名字为====" + s1);
        System.out.println("**********************************************");
        System.out.println("status的个数为===" + statistics1.getCount());
        System.out.println("status的最小值为===" + statistics1.getMin());
        System.out.println("status的求和为===" + statistics1.getSum());
        System.out.println("status的平均值为===" + statistics1.getAverage());
        System.out.println();
        System.out.println();
    }
}

结果如下:





图片


分组统计:


@GetMapping("/list")
public void list(){
    List<InputForm> inputForms = inputFormMapper.selectList();
    System.out.println("inputForms = " + inputForms);

    Map<String, Long> collect = inputForms.stream().collect(Collectors.groupingBy(InputForm::getCreateUserName,
        Collectors.counting()));
    
    System.out.println("collect = " + collect);
}



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




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


2024最新架构课程,对标培训机构

👉点击查看:Java成神之路-进阶架构视频!


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


@GetMapping("/list")
public Map<String, List<InputForm>> list(){
    List<InputForm> inputForms = inputFormMapper.selectList();
    System.out.println("inputForms = " + inputForms);

    Map<String, List<InputForm>> collect = inputForms.stream()
        .collect(Collectors.groupingBy(InputForm::getCreateCompanyName));

    return collect;
}




图片


求最大值,最小值


@GetMapping("/list")
public Map<String, List<InputForm>> list(){
    List<InputForm> inputForms = inputFormMapper.selectList();
    System.out.println("inputForms = " + inputForms);

    Optional<InputForm> min = inputForms.stream()
        .min(Comparator.comparing(InputForm::getId));

    System.out.println("min = " + min);
    return null;
}




图片


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


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


@GetMapping("/list")
public void list(){
    List<InputForm> inputForms = inputFormMapper.selectList();
    System.out.println("inputForms = " + inputForms);

    IntSummaryStatistics collect = inputForms.stream()
        .collect(Collectors.summarizingInt(InputForm::getStatus));
    double average = collect.getAverage();
    int max = collect.getMax();
    int min = collect.getMin();
    long sum = collect.getSum();
    long count = collect.getCount();
    
    System.out.println("collect = " + collect);
}

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


// 求最大值
Optional<InputForm> max = inputForms.stream().max(Comparator.comparing(InputForm::getAgency));
if (max.isPresent()){
    System.out.println("max = " + max);
}

// 求最小值
Optional<InputForm> min = inputForms.stream().min(Comparator.comparing(InputForm::getAgency));
if (min.isPresent()){
    System.out.println("min = " + min);
}

对某个字段求和并汇总


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

求某个字段的平均值


// 求某个字段的平均值
Double collect2 = inputForms.stream().collect(Collectors.averagingInt(InputForm::getStatus));
System.out.println("collect2 = " + collect2);

// 简化后
OptionalDouble average = inputForms.stream().mapToDouble(InputForm::getStatus).average();
if (average.isPresent()){
    System.out.println("average = " + average);
}

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


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

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


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

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


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

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


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



     





        






















胖虎联合两位大佬朋友,一位是知名培训机构讲师和科大讯飞架构,联合打造了《Java架构师成长之路》的视频教程。完全对标外面2万左右的培训课程。



除了基本的视频教程之外,还提供了超详细的课堂笔记,以及源码等资料包..






课程阶段:









  1. Java核心 提升阅读源码的内功心法







  2. 深入讲解企业开发必备技术栈,夯实基础,为跳槽加薪增加筹码










  3. 分布式架构设计方法论。为学习分布式微服务做铺垫







  4. 学习NetFilx公司产品,如Eureka、Hystrix、Zuul、Feign、Ribbon等,以及学习Spring Cloud Alibabba体系







  5. 微服务架构下的性能优化







  6. 中间件源码剖析







  7. 元原生以及虚拟化技术







  8. 从0开始,项目实战 SpringCloud Alibaba电商项目














点击下方超链接查看详情(或者点击文末阅读原文):



(点击查看)  2024年,最新Java架构师成长之路 视频教程!



以下是课程大纲,大家可以双击打开原图查看



















浏览 1177
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报