【版本任你发】-2-分类统计现在有了,需要代码里求总和

80 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第3天,点击查看活动详情

0.背景

  我们在进行企业按组分类统计的时候,经常会遇到还需要获取总数的问题。有人喜欢使用SQL来完成,有人喜欢在代码里写一些简单的逻辑。那么你呢?

1.普通方法

        long totalNumber = 0L;
        for (CompanyCountGroupByTypeName companyCountGroupByTypeName : companyCountGroupByTypeNameList) {
            long companyCount = companyCountGroupByTypeName.getCompanyCount();
            totalNumber += companyCount;
        }

  挺好的,似乎没有什么问题。假如,我又需要平均值了呢?你会说,简单,除以一下就行了。那,其他地方也出现了类似的逻辑怎么提取呢?怎么保证其他人不乱写呢?

  你也许会说:“你故意找茬是不是?”

你故意找茬是不是?

2.Java8中流式处理逻辑

  还真不是,因为遇到太多的重复。不希望再重复的大神们,已经解决了此问题。

  这里头一次提到了流式处理,我们先上一个图感受一下,不细讲,留到后面逐渐深入。

  在《Java实战》中有这样一个定义:

流到底是什么?简短的定义就是“从支持数据处理操作的源生成的元素序列”。

  放两张图来感受一下,然后就收。

  第一张图,讲述流整体的功能的感觉,它像适应性非常好的工作流一样,可以干一系列的工作。

某个流的一生

  讲得细一些,就是一堆元素,可以被过滤、排序、映射、收集……

附带元素的流的处理的展示

  好了,收!现在我们有了一个思路,我们可能通过某种方式来干这个事儿。可能是使用map也可能是collect对吧?那么,我们开始寻找。

3.你想到的,大神能想不到?

  还真有一个消费者类型的工具在java.util,它叫:java.util.LongSummaryStatistics

  它能干啥呢?注释是这样说的:

A state object for collecting statistics such as count, min, max, sum, and average.

用法如下:

LongSummaryStatistics longSummaryStatistics = companyCountGroupByTypeNameList.stream().collect(
                Collectors.summarizingLong(CompanyCountGroupByTypeName::getCompanyCount)
        );
        // 有几种企业类型
        long typeCount = longSummaryStatistics.getCount();
        // 平均数
        double average = longSummaryStatistics.getAverage();
        // 总数
        long sum = longSummaryStatistics.getSum();
        // 最大值
        long max = longSummaryStatistics.getMax();
        // 最小值
        long min = longSummaryStatistics.getMin();

  实际的生产中,我们可以参照 java.util.stream.Collectors#summarizingLong 来编写自己业务代码中重复出现的内存中进行统计的代码逻辑。

结语

  你喜欢 Java 中提供的 Stream 吗?为什么?欢迎你在评论区发表自己的看法,与其他读者讨论。