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

Stream#findFirst()(或find任何)是否将平坦映射的流短路?[重复]

姜鸿
2023-03-14

Java 8流#findFirst()是一种短路终端操作。这意味着一旦找到元素(通常与filter()操作一起使用),它将停止生成流。

但是,我想知道它是否会在平面图创建的流上短路。即它会短路在平面图操作中创建的流。

换句话说,哪种代码更有效(在流中生成的元素更少):

示例1(使用平面图):

    // produce range 0..99 (10 elements at a time)
    return IntStream.rangeClosed(0, 9)
        .flatMap(i -> IntStream.rangeClosed(i * 10, i * 10 + 9))
        .filter(i -> i == 55)
        .findFirst()
        .getAsInt();

示例2(无平面图):

    // produce range 0..99 (all 100 elements at once)
    return IntStream.rangeClosed(0, 99)
        .filter(i -> i == 55)
        .findFirst()
        .getAsInt();

共有1个答案

有耀
2023-03-14

答案是肯定的(使用Java11)

使用peek:

示例1(使用平面图):

    // produce range 0..99 (10 elements at a time)
    return IntStream.rangeClosed(0, 9)
        .flatMap(i -> IntStream.rangeClosed(i * 10, i * 10 + 9))
        .peek(System.out::println)
        .filter(i -> i == 55)
        .findFirst()
        .getAsInt();

示例2(无平面图):

    // produce range 0..99 (all 100 elements at once)
    return IntStream.rangeClosed(0, 99)
        .peek(System.out::println)
        .filter(i -> i == 55)
        .findFirst()
        .getAsInt();

两者都产生了56个元素。(原本以为用平面图会是60个。)

 类似资料:
  • 我需要将一个项目列表映射到可观察的项目中,然后使用另一个函数处理每个可观察的项目flatmap,以将某个REST API调用的结果持久化到数据库中。 API调用将正确返回所有项。但是,FlatMapiteTable不会将所有项目传递给最后一个flatMap。 这是代码。 我不想使用doOnEach或doOnNext,我的问题是关于FlatMapiteTable的行为。 知道为什么我不能到达最后一张

  • 我有一个具有不同复杂性(进程持续时间)的txntype列表。 我想从列表中找到匹配的。 我试图通过混合流的并行处理和短路过滤功能来实现它。 但我注意到它们没有混合。 我编写了下面的示例。但注意到并行和短路的混合不能正常工作。 每次运行都显示并行处理在工作,但在找到项目时没有终止!!! 通过多次运行,我发现处理没有尽快终止,并等待处理所有这些!!!! 是否存在类似的内容?

  • 如果我执行以下“连接”两个流的代码 < li >首先通过平面映射< code >流 我在两种情况下都获得了相同的正确结果,但过滤操作的次数不同。 我在两种情况下都得到了预期的结果(3)。但是,第一个操作对集合的每个元素应用第一个过滤器,而第二个操作在遇到一个过滤器时就停止。输出是: 为什么两者之间的行为有所不同?JDK代码在第一个场景中是否可以改进为与第二个场景中一样高效,或者是否有一些东西使其不

  • 我有一个这样的结构: 和看起来像这样 这不是最好的设计-我知道,但我没有能力改变这个设计。 我正在尝试找到一种方法,将此结构扁平化为单个,并找到一个itemTag 但这仅搜索项目列表的一个级别。如果我想更深入,我可以简单地做: 这很好。但我正试图找到一种更具可扩展性的方法来实现这一点,它可以像嵌套列表一样深入。有没有有效的方法来做到这一点?

  • 我正在尝试使用流将一个列表映射到另一个列表。 原始列表的某些元素无法映射。也就是说,映射函数可能无法找到合适的新值。 null 对更好的方法的建议?或者我应该把溪流全部挖开,用好的旧循环?

  • 问题内容: Python是否支持短路? 问题答案: 是的操作员都短路了-请参阅docs。