Stream 什么是流

流是 从 源生成的 元素序列。java

流是 从支持数据处理操做的 源生成的 元素序列。数据结构

数据处理操做 如filter、map、reduce、find、match、sort等。优化

流操做有两个重要的特色:code

  1. 流水线
  2. 内部迭代

集合与流区别

粗略地说,集合与流之间的差别就在于何时进行计算。集合是一个内存中的数据结构,它包含数据结构中目前全部的值——集合中的每一个元素都得先算出来才能添加到集合中。(内存

相比之下,流则是在概念上固定的数据结构(你不能添加或删除元素),其元素则是按需计算的。get

有点抽象类比为生产手机的流水线吧:集合是一堆生产好的手机,想放进去一个手机,那么这个手机必须生产好的。流是在流水线上的还未生产好的手机,流水线上不能拿走一个,也不能随意放上去一个,流水线上会有一些操做。it

遍历

流只能遍历一遍!io

List<String> title = Arrays.asList("Java8", "In", "Action"); 
Stream<String> s = title.stream(); 
s.forEach(System.out::println); //成功遍历
s.forEach(System.out::println);//java.lang.IllegalStateException:流已被操做或关闭

集合:外部迭代class

流:内部迭代 内部迭代时,项目能够透明地并行处理,或者用更优化的顺序进行处理。stream

流操做

List<String> names = menu.stream() 
 .filter(d -> d.getCalories() > 300)
 .map(Dish::getName) 
 .limit(3) 
 .collect(toList());

你能够看到两类操做:

  • filter、map和limit能够连成一条流水线;

  • collect触发流水线执行并关闭它。

中间操做

中间操做返回的仍是流,例如上面代码的filter、map。除非流水线上触发一个终端操做,不然中间操做不会执行任何处理——它们很懒。

利用流的延迟性质进行的优化:

  • 这是由于limit操做和一种称为短路的技巧。
  • 尽管filter和map是两个独立的操做,但它们合并到同一次遍历中了(咱们把这种技术叫做循环合并)。

终端操做

终端操做会从流的流水线生成结果。其结果是任何不是流的值。流操做中能够据此判断一个操做是中间操做仍是终端操做。

long count = menu.stream() 
 .filter(d -> d.getCalories() > 300) 
 .distinct() 
 .limit(3) 
 .count();//流水线中最后一个操做count返回一个long,这是一个非Stream的值。

使用流

  1. 一个数据源(如集合)
  2. 一个中间操做链,造成一条流的流水线
  3. 一个终端操做,执行流水线,并能生成结果

因此

  • 流是“从支持数据处理操做的源生成的一系列元素”。

  • 流利用内部迭代:迭代经过filter、map、sorted等操做被抽象掉了。

  • 流操做有两类:中间操做和终端操做。

  • filter和map等中间操做会返回一个流,并能够连接在一块儿。能够用它们来设置一条流水线,但并不会生成任何结果。

  • forEach和count等终端操做会返回一个非流的值,并处理流水线以返回结果。

  • 流中的元素是按需计算的。

相关文章
相关标签/搜索