不理解 Java Steam?一步步梳理其工作方式
Java Stream 已经出现很长时间了,但很多Java程序员还是不理解它的工作方式。
不会 Stream 不要紧,我们开发的时候可以不用 Stream,但理解 Stream 是咋回事还是非常必要的,至少得能看懂别人代码中的 Steam 是吧。
下面就通过一段代码,逐条说明每行代码的含义,然后再对照一下不使用 Stream 的用法,之后就可以轻松理解 Stream 的用法了。
1. Stream 示例代码解析
这段 Stream 代码共有 5 行,下面看每一行都是什么意思。
第1行
第一行我们分成2部分来看,一是内部的 Lambda 表达式:
num -> num + 4
这就是一个非常简单的方法,等价于:
int xxx(int num){ return num + 4; }
传入参数 num,然后返回 +4 后的结果。
第2部分是 Stream.iterate() 方法,此方法会创建一个无限的流,第一个参数 “4” 就是流的起点,第二个参数 Lambda 表达式用来生产后续的流元素。
那么第一行联合起来的意思就是,从4开始,之后的每个流元素都是持续 “+4” 计算出来,产生的流就是这个样子:
4, 8, 12, 16, 20, 24, 28, …
第2行
limit() 的作用和 SQL 的 limit 一样,都是用来限制数量的,Stream.iterate() 创建了无限流,通过 limit 将其变为了有限的流,限制了流中元素的个数。
例如参数 total 值为 5,那么流的样子就是:
4, 8, 12, 16, 20
第3行
第三行是 map 方法,其中还是一个 Lambda 表达式。
map 的作用是 ”变换“,把流中每个元素都用其中的 Lambda 表达式进行计算,得到一个新的元素,放入新的流中。
这个 Lambda 表达式的意思是计算平方值,那么流就变为:
4*4, 8*8, 12*12, 16*16, 20*20 => 16, 64, 144, 256, 400
第4行
第四行 filter 的作用是对流元素进行过滤,其中 Lambda 表达式返回的是一个 Boolean 值,返回 True 的放入流中,否则丢弃。
这里是判断元素是否可以被 10 整除,流中只有 400 符合条件,那么流就变为:
400
第5行
第五行 reduce() 方法是最后的归纳总结,它有2个参数。
第一个参数可以理解为基础值,第二个参数是一个操作指令。
这里的意思就是:
从0开始,计算流中所有元素的总和,返回最终的累加值。
所以,这段 Stream 返回的结果就是 400。
2. 代码对照理解
为了更加便于理解,我们把这段 Stream 代码转换为普通写法:
下面把2段代码对照一下。
Steam.iterate() 第一个参数起始值对应 for 中的起始值,Steam.iterate() 第二个参数 Lambda 表达式,对应 for 中的每次循环操作。
limit() 限制流中元素数量,对应 for 循环中的结束条件,因为 for 里面需要限制的是最大数,所以要用元素个数✖️4来计算一下。
map() 对应 for 内部的平方计算。
filter() 过滤方法对应 for 内部的 if 判断。
reduce() 汇总方法对应了3行代码:
- 定义汇总变量及其初始值
- 循环中累加
- 返回最终结果。
通过前面的逐条解析,以及代码对照是不是就很好理解 Steam 啦,希望对你有所帮助。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
30 秒完美实现 Request 中"携带"用户信息,提升 10 倍性能方案
点击python编程从入门到实践,置顶 公众号重磅 python入门资料,第一时间送达 读完需要4分钟 速读仅需 2 分钟 / python 30 秒完美实现 Request 中"携带"用户信息,提升 10 倍性能方案 / 之前在 大型 fastapi 项目实战 靠 python 中间件解决方案涨薪了 一文中 详细的介绍了通过中间件的方式去处理请求中的一些 case,没有看过的同学建议看看。 1 背景介绍 今天我们再看一下另外一个场景:当请求过来的时候,要对请求统一进行权限验证。如果验证通过,那么就把验证过的用户信息附加到 Request 中,这样在具体的路径操作里,就可以直接使用用户信息,而不用再次查询当前用户。同时还有一个好处是减少了重复代码量,将以前的在路径操作部分的权限验证统一提取出来。今天我们通过把数据附加到 request.state 中,来解决这个问题。 2 案例实现 # -*- coding: utf-8 -*-import time @app.middleware("http")async def process_authorizatio...
- 下一篇
vue-bmap-gl v0.0.14 版本发布,接入 BMapGLLib 扩展库,推荐更新
更新内容: * InfoWindowCustom增加open、close事件 * 增加接入BMapGLLib扩展库,可以在初始化时使用plugins参数传入。加载方式:查看 vue-bmap-gl 是一套基于Vue 2.0和百度地图WebGL版本的地图组件。该版本在原来的版本上增加对bmap WebGL1.0的适配,该项目基于https://github.com/ElemeFE/vue-amap/修改开发。
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS7设置SWAP分区,小内存服务器的救世主
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS8编译安装MySQL8.0.19