本系列文章来自CSDN
原文地址:
https://blog.csdn.net/ryo1060732496/article/details/88806283
什么是流?
流是Java API的新成员,它允许你以声明的方式处理数据集合,简单来说,可以把它当作数据集的高级迭代器。此外,流还可以透明地并行处理,你无需写任何多线程代码了。
流简介
Java8中的集合支持一个新的stream方法,它会返回一个流(接口定义在java.util.stream.Stream里)。你在后面会看到,还有很多其他的方法可以得到流,比如利用数值范围或从I/O资源生成流元素。
那么,流到底是什么呢?简短的定义就是从支持数据处理操作的源生成的元素序列。
List<Dish> menu = Dish.MENU;
//从menu获得流
List<String> threeHightCaloricDishNames = menu.stream()
// 通过链式操作,筛选出高热量的菜肴
.filter(d -> d.getCalories() > 300)
// 获取菜名
.map(Dish::getName)
.limit(3)
.collect(Collectors.toList());
我们使用了声明性的方式来处理菜单数据,并没有去实现筛选(filter)、提取(map)或截断(limit)功能,Stream库已经自带了。
流和集合的差别
- 是否急切
Java现有的集合概念和新的流概念都提供了接口,来配合代表元素型有序值的数据接口。所谓有序,就是说我们一般是按顺序取用值,而不是随机取用的。那这两者有什么区别呢?
打个比方说,我们在看电影的时候,这些视频就是一个流(字节流或帧流),流媒体视频播放器只要提前下载用户观看位置的那几帧就可以了,这样不用等到流中大部分值计算出来。比如,我们在Youtube上看的视频进度条随便拖动到一个位置,你会发现它很快就开始播放了,不需要将整个视频都加载好,而是加载了一段。如果,不按照这种方式的话,我们可以想象一下,视频播放器可能没有将整个流作为集合,保存所需要的内存缓冲区——而且要是非得等到最后一帧出现才能开始看,那等待的时间就太长了,早就没耐心看了。
初略地说,集合与流之间的差异就在于什么时候进行计算。集合是一个内存中的数据结构,它包含数据结构中目前所有的值,集合中的每个元素都得先算出来才能添加到集合中。
相比之下,流则是在概念上固定的数据结构,其元素则是按需计(懒加载)算的。需要多少就给多少。这是一种生产者与消费者的关系。从另一个角度来说,流就像是一个延迟创建的集合:只有在消费者要求的时候才会生成值。与之相反,集合则是急切创建的(就像黄牛囤货一样)。
- 只能遍历一次
- 外部迭代与内部迭代