Stream
Java8中的集合支持一个新的stream方法,它会返回一个流(接口定义在java.util.stream.Stream里)。你在后面会看到,还有很多其他的方式可以得到流,比如利用数值范围或从I/O资源生成流元素。
流的数据处理功能支持类似于数据库的操作,以及函数式编程语言中的常用操作,如filter,map,reduce,find,match,sort等。流操作可以顺序执行,也可以并并行执行。
流操作有两个重要的特点。
- 流水线——很多流操作本身会返回一个流,这样多个操作就可以链接起来,形成一个大的流水线。
- 内部迭代——与使用迭代器显示迭代的集合不同,流的迭代操作是在背后进行的。
流与集合
只能遍历一遍
和迭代器类似,流只能遍历一次。遍历完成之后,我们就说这个流已经被消费掉了。你可以从原始数据源哪里再获得一个新的流来重新遍历一遍,就像迭代器一样。例如,以下代码会抛出一个异常,说流已经被消费掉了:
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:流已经被操作活关闭。
所以要记得,流只能消费一次。