当前位置: 首页 > 知识库问答 >
问题:

在java流API中,中间操作被懒洋洋地执行,而终端操作被急切地执行,这意味着什么?

谷玉韵
2023-03-14
list.stream().filter( a-> a < 20 && a > 7).forEach(a -> System.out.println(a));

那是什么意思?

共有1个答案

廉子民
2023-03-14

假设你做了下面的手术。

list.stream()
    .map(a -> a * a)
    .filter(a -> a > 0 && a < 100)
    .map(a -> -a)
    .forEach(a -> System.out.println(a));

中间操作是映射和筛选器,终端操作是foreach。如果急切地执行中间操作,那么.map(a->a*a)将立即映射整个流,并将结果传递给.filter(a->a>0&&a<10),后者将立即过滤结果,然后将结果传递给.map(a->-a),后者将映射过滤的结果,然后将其传递给foreach,后者将立即打印流中的每个元素。

然而,中间操作并不急切,反而是懒惰的。这意味着序列

list.stream()
    .map(a -> a * a)
    .filter(a -> a > 0 && a < 100)
    .map(a -> -a)

那么有什么好处呢?

一个主要的优点是,懒惰方法大大提高了延迟。您可能知道,程序的单个线程一次只能做一件事。再把这个类比延伸一点,想象一下大约有800个盘子,但厨师实际上不得不等待洗衣机洗完盘子,然后递给他一个。如果急切的洗衣员坚持先把盘子洗干净再把盘子递过去,厨师就得等800个盘子都洗完,然后马上上800顿饭,到那时所有愤怒的顾客都离开了。

然而,有了懒惰的洗衣机,厨师每想上一顿饭,他只需要等一个盘子。因此,如果洗一个盘子需要10秒钟,而且几乎是立即上菜,在场景1中,所有的饭菜都将立即上菜,但要等两个多小时才能上菜。但在第二种情况下,每顿饭的供应间隔大约10秒。因此,即使提供所有食物需要相同的时间,情况2肯定更可取。

 类似资料:
  • Redisson 支持对每个操作自动重试的策略并且在每次尝试期会尝试发送命令。 重试策略由设置项 retryAttempts (默认为 3) 和 retryInterval (默认为 1000 ms) 来控制。 每次尝试会在 retryInterval 时间间隔后执行。 Redisson 实例和 Redisson 对象都是完全线程安全的。 带有同步/异步方法的 Redisson 对象可通过 Red

  • 在Spring中,可以将bean配置为懒洋洋地初始化。Spring批处理作业也是(Spring管理的)bean。也就是说,当我配置类似于

  • 因为在过滤2之后,我们还得再找到一个元素来分层极限(2),操作,那么为什么输出不像我解释的那样呢?

  • 我想在服务类和当前实现中的两个功能如下: > 获取父级时“children”应为null 获取父级时应填写“children”:

  • 我正在寻找一种方法来检索替代单声道,以防原始单声道是空的。我找到的最接近的是,但我的问题是,我无法将lambda表达式传递给它,因此即使Mono具有非空值,也会调用它。这有点像vs。 以下是一个示例:

  • 这里有多个任务。其中一个任务是。我们称之为。在任务-1中,我分配一个时间戳并生成水印,我使用,其中等于2min。 下一个操作符是我窗口数据,并在上面做一些聚合,然后下沉到Kafka。让我们将这个聚合和下沉的链接任务称为。 :查看这个度量值,它告诉。 问题:当我窗口元素时,我已经分配了0允许的迟到。所以它可能掉了一些元素。但是当我查看度量时,由于windows不是一个运算符,所以没有度量可以告诉wi