流是 从 源生成的 元素序列。java
流是 从支持数据处理操做的 源生成的 元素序列。数据结构
数据处理操做 如filter、map、reduce、find、match、sort等。优化
流操做有两个重要的特色:code
粗略地说,集合与流之间的差别就在于何时进行计算。集合是一个内存中的数据结构,它包含数据结构中目前全部的值——集合中的每一个元素都得先算出来才能添加到集合中。(内存
相比之下,流则是在概念上固定的数据结构(你不能添加或删除元素),其元素则是按需计算的。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。除非流水线上触发一个终端操做,不然中间操做不会执行任何处理——它们很懒。
利用流的延迟性质进行的优化:
终端操做会从流的流水线生成结果。其结果是任何不是流的值。流操做中能够据此判断一个操做是中间操做仍是终端操做。
long count = menu.stream() .filter(d -> d.getCalories() > 300) .distinct() .limit(3) .count();//流水线中最后一个操做count返回一个long,这是一个非Stream的值。
流是“从支持数据处理操做的源生成的一系列元素”。
流利用内部迭代:迭代经过filter、map、sorted等操做被抽象掉了。
流操做有两类:中间操做和终端操做。
filter和map等中间操做会返回一个流,并能够连接在一块儿。能够用它们来设置一条流水线,但并不会生成任何结果。
forEach和count等终端操做会返回一个非流的值,并处理流水线以返回结果。
流中的元素是按需计算的。