Stream#findFirst()(或findAny)是否会短路平面映射的流?

时间:2019-04-20 02:05:39

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

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

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

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

示例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 个答案:

答案 0 :(得分: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。)