Java8中Stream的黑科技

134 阅读1分钟

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`方法.