Java之流式编程实战
流的使用
实战演示,还是以之前我们所写的购物车案例,演示流的各种操作,前置的准备工作:
1 | package com.stream.shopping; |
打印出购物车商品列表
1 | [{ |
用单元测试的形式一一演示
常用中间操作
对String中间操作的演示
无状态
filter使用
过滤调不符合断言判断的数据
1 | /** |
执行结果
map使用
将一个元素转换成另一个元素
1 | /** |
执行结果
flatMap使用
将一个对象转换成流
1 | /** |
执行结果
peek使用
对流进行遍历操作,与forEach类似,但不会销毁流元素
1 | /** |
执行结果
有状态
sorted使用
对流中元素进行排序,可选择自然排序或指定排序规则
1 | /** |
执行结果
可以看到,总价是按从小到大排序的
distinct使用
对流元素进行去重
1 | /** |
执行结果
skip使用
跳过前N条记录
1 | /** |
执行结果
limit使用
截断前N条记录
1 | /** |
执行结果
通过skip与limit的功能,可以做一个简单的假的分页功能
1 | /** |
通过修改skip中页数*条数
(注:页数从0开始),并截取条数,实现假的分页功能,执行结果:
第一页:
第二页:
总结
以上是对String的中间操作演示示例,对于不同操作有以下总结:
- filter使用:过滤调不符合断言判断的数据
- map使用:将一个元素转换成另一个元素
- flatMap使用:将一个对象转换成流
- peek使用:对流进行遍历操作,与forEach类似,但不会销毁流元素
- sorted使用:对流中元素进行排序,可选择自然排序或指定排序规则
- distinct操作:对流元素进行去重,有状态的操作
- skip使用:跳过前N条记录,有状态的操作
- limit使用:截断前N条记录,有状态的操作
常用终端操作
短路
allMatch使用
所有元素匹配,返回true
1 | /** |
执行结果
anyMatch使用
1 | /** |
执行结果
noneMatch使用
1 | /** |
执行结果
findFirst使用
1 | /** |
执行结果
findAny使用
1 | /** |
执行结果
非短路
maxTest使用
1 | /** |
执行结果
minTest使用
1 | /** |
执行结果
count使用
1 | /** |
执行结果
总结
以上是对String的终端操作演示示例,对于不同操作有以下总结:
- allMatch使用:所有元素匹配,返回true
- anyMatch使用:任何元素匹配要匹配,返回true
- noneMatch使用:任何元素都不匹配,返回true
- findFirst使用:找到第一个,则返回
- findAny使用:找到任何一个
- max使用:获取流统计的最大值
- min使用:获取流统计的最小值
- count使用:获取流中元素的个数
流的构建
- 由值创建流
- 由数组创建流
- 由文件生成流
- 由函数生成流(无限流)
Stream构建四种形式
由数值直接构建流
1 | /** |
执行结果
由数组创建流
1 | /** |
执行结果
由文件生成流
1 | /** |
注意:替换文件地址
执行结果
由函数生成流(无限流)
由于是无限流,因此使用limit限制一下
Iterate
1 | /** |
执行结果
Generate
1 | /** |
执行结果
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Jing's Blog!