【问题标题】:Does Stream#findFirst() (or findAny) shortcircuit a flatmapped stream? [duplicate]Stream#findFirst()(或 findAny)是否会使平面映射流短路? [复制]
【发布时间】:2019-04-20 02:05:39
【问题描述】:

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

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

换句话说,哪个代码更高效(就在流中生成更少的元素而言):

示例 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();

【问题讨论】:

  • 使用peekSystem.out.print 来查看结果。否则详细说明高效
  • @Naman 谢谢。没听说过peek,答案是肯定的。它们都只生成了 55 个元素。

标签: java java-8 java-stream flatmap findfirst


【解决方案1】:

答案是肯定的(使用 Java 11)

使用偷看:

示例 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。)

【讨论】:

  • 它是——在 Java 10 之前。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-19
  • 2021-08-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多