栏目分类
ANyONe Protocol中文网
你的位置:ZCL中文网 > ANyONe Protocol中文网 > Java8使用Stream流实现List列表查询、统计、排序以及分组Java8使用Stream流实现List列表查询、统计、排序以及分组
发布日期:2025-01-03 17:36 点击次数:115
Java8提供了Stream(流)处理集合的关键抽象概念,它可以对集合进行操作,可以执行非常复杂的查找、过滤和映射数据等操作。Stream API 借助于同样新出现的Lambda表达式,极大的提高编程效率和程序可读性。
下面是使用Stream的常用方法的综合实例。
创建User类作为持久层。
创建UserService.class(用户信息业务逻辑类)。
一、查询方法
1.1 forEach()
使用 forEach() 遍历列表数据。
控制台输出:
1.2 filter(T -> boolean)
使用 filter() 过滤列表数据。
【示例】获取部门为“研发部”的用户列表。
控制台输出:
1.3 findAny() 和 findFirst()
使用 findAny() 和 findFirst() 获取第一条数据。
【示例】获取用户名称为“wsq的博客_02”的用户信息,如果未找到则返回null。
控制台输出:
注意:findFirst() 和 findAny() 都是获取列表中的第一条数据,但是findAny()操作,返回的元素是不确定的,对于同一个列表多次调用findAny()有可能会返回不同的值。使用findAny()是为了更高效的性能。如果是数据较少,串行地情况下,一般会返回第一个结果,如果是并行(parallelStream并行流)的情况,那就不能确保是第一个。
例如:使用parallelStream并行流,findAny() 返回的就不一定是第一条数据。
1.4 map(T -> R) 和 flatMap(T -> Stream)
使用 map() 将流中的每一个元素 T 映射为 R(类似类型转换)。
使用 flatMap() 将流中的每一个元素 T 映射为一个流,再把每一个流连接成为一个流。
【示例】使用 map() 方法获取用户列表中的名称列。
控制台输出:
【示例】使用 flatMap() 将流中的每一个元素连接成为一个流。
控制台输出:
1.5 distinct()
使用 distinct() 方法可以去除重复的数据。
【示例】获取部门列表,并去除重复数据。
控制台输出:
1.6 limit(long n) 和 skip(long n)
limit(long n) 方法用于返回前n条数据,skip(long n) 方法用于跳过前n条数据。
【示例】获取用户列表,要求跳过第1条数据后的前3条数据。
控制台输出:
二、判断方法
2.1 anyMatch(T -> boolean)
使用 anyMatch(T -> boolean) 判断流中是否有一个元素匹配给定的 T -> boolean 条件。
2.2 allMatch(T -> boolean)
使用 allMatch(T -> boolean) 判断流中是否所有元素都匹配给定的 T -> boolean 条件。
2.3 noneMatch(T -> boolean)
使用 noneMatch(T -> boolean) 流中是否没有元素匹配给定的 T -> boolean 条件。
【示例】使用 anyMatch()、allMatch()、noneMatch() 进行判断。
控制台输出:
三、统计方法
3.1 reduce((T, T) -> T) 和 reduce(T, (T, T) -> T)
使用 reduce((T, T) -> T) 和 reduce(T, (T, T) -> T) 用于组合流中的元素,如求和,求积,求最大值等。
【示例】使用 reduce() 求用户列表中年龄的最大值、最小值、总和。
控制台输出:
3.2 mapToInt(T -> int) 、mapToDouble(T -> double) 、mapToLong(T -> long)
int sumVal = userList.stream().map(User::getAge).reduce(0,Integer::sum);计算元素总和的方法其中暗含了装箱成本,map(User::getAge) 方法过后流变成了 Stream 类型,而每个 Integer 都要拆箱成一个原始类型再进行 sum 方法求和,这样大大影响了效率。针对这个问题 Java 8 有良心地引入了数值流 IntStream, DoubleStream, LongStream,这种流中的元素都是原始数据类型,分别是 int,double,long。
流转换为数值流:
mapToInt(T -> int) : return IntStreammapToDouble(T -> double) : return DoubleStreammapToLong(T -> long) : return LongStream
【示例】使用 mapToInt() 求用户列表中年龄的最大值、最小值、总和、平均值。
控制台输出:
3.3 counting() 和 count()
使用 counting() 和 count() 可以对列表数据进行统计。
【示例】使用 count() 统计用户列表信息。
控制台输出:
3.4 summingInt()、summingLong()、summingDouble()
用于计算总和,需要一个函数参数。
控制台输出:
3.5 averagingInt()、averagingLong()、averagingDouble()
用于计算平均值。
控制台输出:
3.6 summarizingInt()、summarizingLong()、summarizingDouble()
这三个方法比较特殊,比如 summarizingInt 会返回 IntSummaryStatistics 类型。
IntSummaryStatistics类提供了用于计算的平均值、总数、最大值、最小值、总和等方法,方法如下图:
【示例】使用 IntSummaryStatistics 统计:最大值、最小值、总和、平均值、总数。
控制台输出:
3.7 BigDecimal类型的统计
对于资金相关的字段,通常会使用BigDecimal数据类型。
【示例】统计用户薪资信息。
控制台输出:
四、排序方法
4.1 sorted() / sorted((T, T) -> int)
如果流中的元素的类实现了 Comparable 接口,即有自己的排序规则,那么可以直接调用 sorted() 方法对元素进行排序,如 Stream。反之, 需要调用 sorted((T, T) -> int) 实现 Comparator 接口。
【示例】根据用户年龄进行排序。
控制台输出:
五、分组方法
5.1 groupingBy
使用 groupingBy() 将数据进行分组,最终返回一个 Map 类型。
【示例】根据部门对用户列表进行分组。
控制台输出:
5.2 多级分组
groupingBy 可以接受一个第二参数实现多级分组。
【示例】根据部门和性别对用户列表进行分组。
5.3 分组汇总
【示例】根据部门进行分组,汇总各个部门用户的平均年龄。
总结
到此这篇关于Java8使用Stream流实现List列表查询、统计、排序以及分组的文章就介绍到这了,更多相关Java8 Stream流常用方法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
上一篇:没有了
下一篇:全球氢燃料电池汽车四强
下一篇:全球氢燃料电池汽车四强
相关文章
- 2025-01-12FEG 过渡到币安智能链 (BSC)
- 2025-01-10超12万亿元!比特币市值超白银,特斯拉收益近40亿元,相关ETF四天“吸金”246亿元 | 每经网
- 2025-01-06MOLI万站,正式上线
- 2025-01-04GovHK 香港政府一站通:網上申請非本地畢業生留港/回港就業安排
- 2025-01-04系统选项 - 一般