Java 8 stream operations execution order(Java 8 流操作执行顺序)
问题描述
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8);
List<Integer> twoEvenSquares = numbers.stream().filter(n -> {
System.out.println("filtering " + n);
return n % 2 == 0;
}).map(n -> {
System.out.println("mapping " + n);
return n * n;
}).limit(2).collect(Collectors.toList());
for(Integer i : twoEvenSquares)
{
System.out.println(i);
}
when executed the logic below output came
filtering 1
filtering 2
mapping 2
filtering 3
filtering 4
mapping 4
4
16
if the stream follows the short circuit concept (where we use limit stream operation), then output must be like below:
filtering 1
filtering 2
filtering 3
filtering 4
mapping 2
mapping 4
4
16
because after filtering 2, we have to still find one more element to stratify limit(2), operation, so why the output is not coming like I explained?
Streams are pull-based. Only a terminal operations (like the collect
) will cause items to be consumed.
Conceptually this means that collect
will ask an item from the limit
, limit
from the map
and map
from the filter
, and filter
from the stream.
Schematically the code in your question leads to
collect
limit (0)
map
filter
stream (returns 1)
/filter (false)
filter
stream (returns 2)
/filter (true)
/map (returns 4)
/limit (1)
limit (1)
map
filter
stream (returns 3)
/filter (false)
filter
stream (returns 4)
/filter (true)
/map (returns 16)
/limit (2)
limit (2)
/limit (no more items; limit reached)
/collect
And this conforms to your first printout.
这篇关于Java 8 流操作执行顺序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:Java 8 流操作执行顺序
基础教程推荐
- 在螺旋中写一个字符串 2022-01-01
- Java 中保存最后 N 个元素的大小受限队列 2022-01-01
- 如何对 HashSet 进行排序? 2022-01-01
- 首次使用 Hadoop,MapReduce Job 不运行 Reduce Phase 2022-01-01
- Spring Boot Freemarker从2.2.0升级失败 2022-01-01
- 由于对所需库 rt.jar 的限制,对类的访问限制? 2022-01-01
- 如何使用 Eclipse 检查调试符号状态? 2022-01-01
- 如何强制对超级方法进行多态调用? 2022-01-01
- 如何在不安装整个 WTP 包的情况下将 Tomcat 8 添加到 Eclipse Kepler 2022-01-01
- 如何使用 Stream 在集合中拆分奇数和偶数以及两者的总和 2022-01-01