Java 8流操作执行顺序 [英] Java 8 stream operations execution order
问题描述
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);
}
执行时输出的逻辑
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
因为在过滤2之后,我们还要找到一个元素来分层限制(2),操作,那么为什么输出不像我解释的那样?
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是基于拉式的。只有终端操作(如 collect
)才会导致消耗物品。
Streams are pull-based. Only a terminal operations (like the collect
) will cause items to be consumed.
从概念上讲,这意味着 collect
将从限制
,限制
中询问项目。来自过滤器
的code> map 和 map
,以及从流中过滤
。
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.
示意图中的代码导致
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流操作执行顺序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!