系统学习Java新特性-Stream理论与概念

216 阅读2分钟

这是我参与11月更文挑战的第2天,活动详情查看:2021最后一次更文挑战

阅读《Java实战》第4章总结,本章主要是系统了解Stream的相关理论概念,比如什么是流、集合与流的关系、内部迭代与外部迭代、以及流的中间操作与终端操作定义。

1、什么是流

定义一:Stream(流) 是一个来自数据源的元素队列并支持聚合操作。

定义二:Steam是从支持数据处理操作的源生成的一系列元素。

核心要素:

  • 元素:特定类型的对象,形成一个队列。Java中的Stream并不会存储元素,而是按需计算。
  • 数据源:流的来源,可以是集合、数组、I/O channel等。
  • 聚合操作:流的数据处理功能支持类似数据库的操作,比如filter/map/reduce/sorted/find等。

和以前Collection操作不同,Stream操作还有两个基础特征:

  • 流水线(Pipelining):中间操作都会返回流对象本身。这样多个操作就可以链接起来,构成一个更大的流水线。这样也便于操作进行些特殊优化,如延迟执行和短路等。
  • 内部迭代:与集合使用Iterator或者For-each方式,显示迭代不同。Stream提供内部迭代方式,通过访问者模式(Visitor)实现。

2、流和集合

  • 集合:
    • 内存中的数据结构,包含数据结构中的所有值。
    • 集合元素必须先算出来才能添加,可以删改。
    • 外部迭代:遍历操作需要用户显式使用for-each去操作。
  • 流:
    • 概念上固定的数据结构(不能删改),元素是按需计算加载。
    • 只能遍历一次,遍历完也就表示消费完。
    • 内部迭代:声明相应的迭代方法,内部会自行选择最优方法去实现。

3、流操作

主要分为两大类:中间操作(返回一个流)、终端操作(返回一个结果非原来流对象内容)。

3.1 中间操作

  • 中间操作会返回另一个流,因此可以多个操作连接起来形成一个流水线查询。
  • 中间操作只有在终止操作触发时,才会被执行。
  • 常见中间操作:filter(Predicate)、map(Function<T,R>)、sorted(Comparator)

3.2 终端操作

  • 从流的流水线生成一个非流的结果,比如List/Integer,甚至void。
  • 常见终端操作:forEach(返回void,消费流中每个元素并对其应用lambda)、count(long ,返回流中元素个数)、collect 把流归约成一个集合,比如List、Map。

3.3 实用流的三要素

  • 创建流:一个数据源来执行查询。
  • 中间操作链:使用中间操作,形成一个流的流水线。
  • 终端操作:触发流水线执行,并生成结果返回。