什么是Java中的流?

Java 中流的定义是“源中支持聚合操作的一系列元素”。流从诸如集合,数组或I / O资源之类的源中消耗。流支持功能编程语言的通用操作,例如映射,过滤,缩小,查找,排序等。
例子
链接使用lambda表达式作为参数的多种方法很容易。Java 8之前的复杂计算可以用更少的行编写。
这是来自Java doc [1]的很好的激励示例:
int sum = components.stream()
.filter(c -> c.getColor() == RED)
.mapToInt(c -> c.getWeight())
.sum();
在此示例中,我们使用组件,集合作为流的源,然后对流执行filter-map-reduce操作以获得红色小部件的权重之和。
流与集合
流似乎类似于集合,但是它们是非常不同的概念。当使用大型数据集时,您可能不想将整个数据集作为一个集合进行处理。比较Collection和Stream [5]之间的区别时,有一个很好的隐喻。考虑一下存储在DVD上的电影与通过互联网流式传输的电影。电影可以看作一组字节。由于DVD​​包含整个数据元素,因此可以将其视为字节的集合。通过互联网观看电影时,可以将电影视为字节流。流式视频播放器只需要在用户观看的位置之前有几个字节即可。这样,视频播放器可以从流的开头开始显示电影,甚至无需计算流中的大多数数据。
流和集合之间的区别可以按以下方式逐项列出:
1.流为特定元素类型的序列值提供接口。但是,与集合不同,流实际上并不存储元素。元素是按需计算的。可以将流视为延迟构造的Collection,可以在需要它们时计算其值。
2.流操作不会更改其源。相反,它们返回存储结果的新流。
3.可能*。集合的大小是有限的,但是流没有。诸如limit(n)或findFirst()之类的短路操作可以允许对无限流的计算在有限时间内完成。
4.消耗品。在流的生存期内,流的元素仅被访问一次。如果要重新访问流中的同一元素,则需要根据源重新生成新的流。
中级运营与终端运营
中间操作将一个流转换为另一流,而终端操作则产生结果。在流上执行终端操作时,将无法再使用该流。
例如,在下面的代码中:
list.stream().filter(s -> s.length() > 2).count();
filter()是中间操作,而count()是终端操作。调用count()时,我们不能再使用该流。
常用的中间操作包括:筛选,映射,不同,排序,跳过,限制,flatMap
常用的终端操作包括:
1.forEach,toArray,收集,减少,计数,最小,最大
2.findFirst,findAny,anyMatch,allMatch,noneMatch
最后,开发这么多年我也总结了一套学习Java的资料与面试题,如果你在技术上面想提升自己的话,可以关注我,私信发送领取资料或者在评论区留下自己的联系方式,有时间记得帮我点下转发让跟多的人看到哦。什么是Java中的流?