Stream#findFirst()(或 findAny)是否使平面映射流短路?
Does Stream#findFirst() (or findAny) shortcircuit a flatmapped stream?
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();
答案是肯定的(使用Java11)
使用速览:
示例 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个元素。
(本来以为flatmap是60。)
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();
答案是肯定的(使用Java11)
使用速览:
示例 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个元素。 (本来以为flatmap是60。)