Stream
是java8添加的新特性, 可以将集合中元素按照流水线的方式调用. 如果只是方法把Stream
作为返回类型调用Stream
的方法. 那就流于表面上的流水线, 称不上黑科技. 比较下下面代码的预期结果和实际结果看看.
Stream<String> strs = Stream.generate(() -> "A").limit(3);
strs.map(s -> {
System.out.println("map1");
return s + "A";
}).map(s -> {
System.out.println("map2");
return s + "A";
}).map(s -> {
System.out.println("map3");
return s + "A";
}).forEach(System.out::println);
从map
方法的定义<R> Stream<R> map(Function<? super T, ? extends R> mapper)
来说. 执行了三次map方法, 每次返回一个Stream
对象. 最后调用forEach
方法. 那结果就应该是
map1
map1
map1
map2
map2
map2
map3
map3
map3
AAAA
AAAA
AAAA
实际结果让人吃惊哦:
map1
map2
map3
AAAA
map1
map2
map3
AAAA
map1
map2
map3
AAAA
Stream 将三次map
调用和一次forEach
调用进行了优化. 使每遍历一个元素, 都会执行一次三个map'和一次
forEach`方法.