
Stream流是在Java8中引入的一个新特性,并且这个新特性被我们广泛应用到了对于集合类的处理上。例如要使用一个集合类完成一个查找操作,一般的做法就是通过遍历的方式,再高级一点的做法就是利用迭代器,而再高级的用法就是使用Stream流操作了。接下来我们就来详细的介绍Stream流操作。
Stream流到底是什么?
流操作,简单的可以理解为将一个数据操作通过一系列的转换形成一个元素操作序列,然后对这个元素操作序列进行操作的过程就被称为是流操作。
什么意思呢?
建设有一个数据序列如下所示。
List list = Arrays.asList(111,222,333);
我们可以将这个列表看做是一个数据序列,那么我们可以对个数据序列完成那些操作呢?
- 可以添加元素
- 可以查找元素
- 可以对元素进行排序
- 可以对元素进行映射操作
- 可以对元素进行匹配操作
我们会发现这些操作,都可以对这个序列中的每个元素进行。也就是说我们可以将其看做一个整体序列进行处理。那么就与上面我们提到的流转换的思想一致了,如下所示。
Stream stream = list.stream();
当然我们还可以通过直接创建的方式来创建一个流。
IntStream stream = Arrays.stream(new int(){111,222,333});
还可以通过静态方法来创建一个流对象。
Stream stream = Stream.of(111, 222, 333);
流操作的核心思想
根据上面的分析,可以得到如下的一个结论,流操作有点类似于流水线操作,在工厂中,每个流水线上都会有指定的产品,而流处理中每个流中也只会有同一个模型。并且在流处理的过程中,并不需要额外的空间来存储处理的结果,而是通过一系列的流水线操作最终产出我们所需要的产品即可。
如下,模拟了一个流水线生产产品的流程。
List twofoods = goods.stream()//获取流
.filter(goods1 -> goods1.getVolume()>200)//筛选商品体积大于200的
.map(Goods::getName)//获取商品名称
.limit(2)//筛选头两个商品
.collect(Collectors.toList());//将结果保存在list中
从代码中可以看到,首先创建了一个流水线,goods.stream()。然后就是在这个流水线上去建立一个.filter(goods1 -> goods1.getVolume()>200)过滤器,筛选出体积较大的产品,接下来获取到了商品的名称.map(Goods::getName),并且从商品中挑选出了两个放入到一个list中。
会看到整个的过程完全是通过流水线的方式进行,中间并没有引入多余的迭代器和存储空间。
从整个的过程来看,要想满足一个流操作就必须要满足如下的三点内容
- 1、需要有一个数据源可以被转换成元数据序列
- 2、需要存在一个可以被正常执行的流水线的处理过程
- 3、需要存在一个能够执行流水线并且生成一个正确的处理结果
这三者缺一不可,缺一个都无法完成整体的流操作。并且需要注意的是,一个流操作是一个一次性的过程,如同一个流水线一样,从流水线上过去的产品只能被这个流水线处理一次,如果再次处理的话就会报错。
从上面代码中也可以看出,流操作确实要比我们使用循环或者是使用迭代器要节省很多的空间。并且,没有多余的系统开销。在性能方面确实有很大的提升。
总结
在使用流操作的过程中一定要注意其核心思想。就是处理的数据必须是可以被处理成元数据序列的数据,并且在一次流处理的过程中,一个流只能被处理一次,如果重复处理则会报错。在使用流处理数据的过程中,流并不会保存中间状态的数据,也不会修改数据源数据,只会讲最终处理完的操作输出出来。所以在使用流操作的时候,一定要掌握其核心,就是它是以流水线操作,并且每个元素在流水线上只能被改变一次。
本文暂时没有评论,来添加一个吧(●'◡'●)