流是什么

1,477 阅读2分钟

流是Java API的新成员,它允许你以声明性方式处理数据集合(通过查询语句来表达,而不是临时编写一个实现)。就现在来说,你可以把它们看成遍历数据集的高级迭代器。此外,流还可以透明地并行处理,你无需写任何多线程代码了!

  那么,流到底是什么?简短的定义就是“从支持数据处理操作的源生成的元素序列”。

  • 元素序列--就像集合一样,流也提供了一个接口,可以访问特定元素类型的一组有序值。因为集合是数据结构,所以它的主要目的是以特定的时间/空间复杂度存储和访问元素(如ArrayList与LindedList)。集合讲的是数据,流讲的是计算。
  • --流会使用一个提供数据源,如集合、数组或输入/输出资源。请注意,从有序集合生成流时会保留原有的顺序。由列表生成的流,其元素顺序和列表一致。
  • 数据处理操作--流的数据处理功能支持类似于数据库的操作,以及函数式编程语言中的常用操作,如filter,map,reduce,find,match,sort等。流操作可以顺序执行,也可以并行执行。
  • 流水线--很多流操作本身会返回一个流,这样多个操作可以链接起来,形成一个大的流水线。这让一些优化成为可能,如延迟和短路。流水线的操作可以看作对数据源进行数据库式查询。
  • 内部迭代--与使用迭代器显式迭代的集合不同,流的迭代操作是在背后进行的。

请注意,和迭代器类似,流只能遍历一次。遍历完之后,我们就说这个流已经被消费掉了。你可以从原始数据源那里再获得一个新的流来重新遍历一次,就像迭代器一样。如果对已经消费掉的流进行遍历会抛出java.lang.IllegalStateException:流已被操作或关闭。

使用Collection接口需要用户去做迭代(比如for-each),这称为外部迭代。相反,S天热按库使用内部迭代--它帮你把迭代做了,还把得到的流值存在了某个地方,你只要给出一个函数说要干什么就可以了。