您好!
欢迎来到京东云开发者社区
登录
首页
博文
课程
大赛
工具
用户中心
开源
首页
博文
课程
大赛
工具
开源
更多
用户中心
开发者社区
>
博文
>
聊一聊Java中的Steam流
分享
打开微信扫码分享
点击前往QQ分享
点击前往微博分享
点击复制链接
聊一聊Java中的Steam流
自猿其说Tech
2023-06-17
IP归属:北京
15920浏览
计算机编程
# 1 引言 在我们的日常编程任务中,对于集合的制造和处理是必不可少的。当我们需要对于集合进行分组或查找的操作时,需要用迭代器对于集合进行操作,而当我们需要处理的数据量很大的时候,为了提高性能,就需要使用到并行处理,这样的处理方式是很复杂的。流可以帮助开发者节约宝贵的时间,让以上的事情变得轻松。 # 2 流简介 流到底是什么呢?简要的定义为“从支持数据处理操作的源生成的元素序列”,接下来对于这个定义进行简要分析。 ## 2.1 支持数据处理操作 流的数据处理操作和数据库的可以声明式的指定分组或查找等功能支持类似,和函数式编程的思想一致,如filter、map、reduce、find、match、sort等操作,这些流操作可以串行执行,也可以并行执行。 ## 2.2 源 流会使用一个提供数据的源,可以通过三种方式来创建对象流,一种是由集合对象创建流: ```java List<Integer> list = Arrays.asList(111,222,333); Stream<Integer> stream = list.stream(); ``` 一种是由数组创建流: ```java IntStream stream = Arrays.stream(new int(){111,222,333}); ``` 一种是由静态方法Stream.of()创建流,底层还是Arrays.stream(): ```java Stream<Integer> stream = Stream.of(111, 222, 333); ``` Stream<Integer> stream = Stream.of(111, 222, 333); 从有序集合生成流时会保留原有的顺序。由列表生成的流,其元素顺序与列表一致。 还有两种特殊的流: - 空流:Stream.empty() - 无限流:Stream.genarate() ## 2.3 元素序列 流也可以和集合一样访问包含特定的元素类型的一组有序值,但是它们的主要目的不一样,集合的主要目的是在于存储和访问元素,流的主要目的在于表达计算。 # 3 流的思想 流式思想和生产中的流水线具有异曲同工之妙,很多流模型都会返回一个流,这些模型都只负责它所需要做的事情,并不需要格外的内存空间来存储处理的结果。这些流模型可以被链接起来形成一个大的流水线,我们在这个过程中不关注中间步骤的数据被如何处理,只需要使用整个流水线处理后的结果。接下来的代码可以体现这种思想,代码中以商品为例,我们要筛选出商品中体积大于200的前两个商品的名字。 首先是商品类的定义: ```java public class Goods { private final String Name; private final Integer Volume; public Goods(String name, Integer volume) { Name = name; Volume = volume; } public String getName() { return Name; } public Integer getVolume() { return Volume; } } ``` 接下来是商品集合的定义: ```java List<Goods> goods = Arrays.asList(new Goods("土豆",10), new Goods("冰箱",900),new Goods("办公椅",300)); ``` 接下来获取我们想要的结果: ```java List<String> twofoods = goods.stream()//获取流 .filter(goods1 -> goods1.getVolume()>200)//筛选商品体积大于200的 .map(Goods::getName)//获取商品名称 .limit(2)//筛选头两个商品 .collect(Collectors.toList());//将结果保存在list中 ``` 这样看来,通过流来处理我们的特定需求,是不是比使用集合的迭代要方便很多呢? # 4 流处理的特性 - 不存储数据 - 不会改变数据源 - 只可被使用一次 这里我们使用一个测试类StreamCharacteristic来验证流处理的以上特性: ```java import org.springframework.util.Assert; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; import java.util.stream.Stream; public class StreamCharacteristic { public void test1(){ List<Integer> list = Arrays.asList(1,2,2,5,6,9); list.stream().distinct(); System.out.println(list.size()); } public void test2(){ List<String> list = Arrays.asList("wms", "KA", "5.0"); Stream<String> stream = list.stream(); stream.forEach(System.out::println); stream.forEach(System.out::println); } } ``` test1()中的结果为6,尽管我们对于list对象所生成的Stream流做了去重操作distinct(),但是不影响数据源list。 test2()中调用了两次 stream.forEach方法来打印每一个单词,第二次调用时,抛出了一个“java.lang.IllegalStateException”异常:“stream has already been operated upon or closed”。这说明流不存储数据,遍历完后这个流已经被消费掉了,而且流不可以重复使用。 # 5 流操作与流的使用 将所有的流操作连接起来可以组合成一个管道,管道有两类操作:中间操作和终端操作。 StreamAPI常用的中间操作有:filter,map,limit,sorted,distinct。 StreamAPI常用的终端操作有:forEach,count,collect。 在使用流的时候,主要需要三个要素:一个用来执行查询的数据源,用来形成一条流的流水线的中间操作链,一个能够执行流水线并能生成结果的终端操作。 下图展示了流的整个操作流程: ![](//img1.jcloudcs.com/developer.jdcloud.com/8ff3ea74-3fe6-46ed-abf9-6e8b134c54ca20230419171723.png) # 6 总结 - 流是从支持数据处理操作的源生成的元素序列 - 流的思想类似于生产中的流水线 - 流不存储数据,不改变数据源,只能被改变一次 - 流的操作主要分为中间操作和终端操作两大类 ------------ 自猿其说Tech-JDL京东物流技术与数据智能部 **作者:王辰玮**
原创文章,需联系作者,授权转载
上一篇:MySQL之InnoDB存储结构
下一篇:京东金融Android瘦身探索与实践
相关文章
Taro小程序跨端开发入门实战
Flutter For Web实践
配运基础数据缓存瘦身实践
自猿其说Tech
文章数
426
阅读量
2149964
作者其他文章
01
深入JDK中的Optional
本文将从Optional所解决的问题开始,逐层解剖,由浅入深,文中会出现Optioanl方法之间的对比,实践,误用情况分析,优缺点等。与大家一起,对这项Java8中的新特性,进行理解和深入。
01
Taro小程序跨端开发入门实战
为了让小程序开发更简单,更高效,我们采用 Taro 作为首选框架,我们将使用 Taro 的实践经验整理了出来,主要内容围绕着什么是 Taro,为什么用 Taro,以及 Taro 如何使用(正确使用的姿势),还有 Taro 背后的一些设计思想来进行展开,让大家能够对 Taro 有个完整的认识。
01
Flutter For Web实践
Flutter For Web 已经发布一年多时间,它的发布意味着我们可以真正地使用一套代码、一套资源部署整个大前端系统(包括:iOS、Android、Web)。渠道研发组经过一段时间的探索,使用Flutter For Web技术开发了移动端可视化编程平台—Flutter乐高,在这里希望和大家分享下使用Flutter For Web实践过程和踩坑实践
01
配运基础数据缓存瘦身实践
在基础数据的常规能力当中,数据的存取是最基础也是最重要的能力,为了整体提高数据的读取能力,缓存技术在基础数据的场景中得到了广泛的使用,下面会重点展示一下配运组近期针对数据缓存做的瘦身实践。
自猿其说Tech
文章数
426
阅读量
2149964
作者其他文章
01
深入JDK中的Optional
01
Taro小程序跨端开发入门实战
01
Flutter For Web实践
01
配运基础数据缓存瘦身实践
添加企业微信
获取1V1专业服务
扫码关注
京东云开发者公众号