开启掘金成长之旅!这是我参与「掘金日新计划 · 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 吗?为什么?欢迎你在评论区发表自己的看法,与其他读者讨论。