Java 8流操作执行顺序 [英] Java 8 stream operations execution order

查看:125
本文介绍了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);
}

执行时输出的逻辑

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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆