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();
答案是肯定的(使用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。