只想在这里加上我的两分钱,一般来说,让一条流短路的想法是无限复杂的(至少对我来说,至少在这个意义上,我通常要搔两次头)。顺便说一句,我将在回答结束时跳过。
举个例子:
Stream.generate(() -> Integer.MAX_VALUE);
这是一个无限流,我们都同意这一点。让我们通过记录为这样的操作来短路它(与skip
不同):
Stream.generate(() -> Integer.MAX_VALUE).anyMatch(x -> true);
这很好,添加一个过滤器怎么样
Stream.generate(() -> Integer.MAX_VALUE)
.filter(x -> x < 100) // well sort of useless...
.anyMatch(x -> true);
这里会发生什么?好吧,这永远不会结束,即使有像anyMatch
这样的短路操作-但它从未达到真正短路任何东西。
另一方面,filter
不是短路操作,但您可以这样做(仅作为示例):
someList.stream()
.filter(x -> {
if(x > 3) throw AssertionError("Just because");
})
是的,它很难看,但它短路了。。。这就是我们(强调我们,因为许多人不同意)实现短路减少的方式-抛出一个没有堆栈跟踪的异常。
在java-9
中,添加了另一个短路的中间操作:takAh
,其行为有点像限制
,但对于特定条件。
公平地说,关于skip的大部分答案是Aomine已经给出的,但最简单的答案是它没有这样的文档记录。一般来说(在某些情况下,文档已更正),但这是您应该注意的首要指示。例如,请参见明确说明:
这是一种短路状态中间操作
来自“流操作和管道”部分下的java文档:
如果中间操作在输入无限时可能产生有限流,则中间操作为短路。当输入无限大时,如果终端操作可能在有限时间内终止,则终端操作为短路。
强调我的。
如果您要在无限输入上调用skip
,它不会产生有限流,因此不会产生短路操作。
JDK8中唯一的短路中间操作是限制,因为它允许在有限时间内完成无限流上的计算。
例子:
如果要使用跳过来执行此程序:
String[] skip = Stream.generate(() -> "test") // returns an infinite stream
.skip(20)
.toArray(String[]::new);
它不会产生有限的流,因此最终会得到类似“java.lang.OutOfMemoryError:java堆空间”的东西。
而如果您要使用limited
执行此程序,它将导致计算在有限
时间内完成:
String[] limit = Stream.generate(() -> "test") // returns an infinite stream
.limit(20)
.toArray(String[]::new);
我理解下面的区别(至少对于Java): 但我的问题是,当你在处理布尔表达式时,有没有理由使用非短路运算符?是否有一些性能上的好处或使用不会被认为是坏的练习?
Skip 抑制Observable发射的前N项数据 使用Skip操作符,你可以忽略Observable’发射的前N项数据,只保留之后的数据。 RxJava中这个操作符叫skip。skip的这个变体默认不在任何特定的调度器上执行。 Javadoc: skip(int)) skip的这个变体接受一个时长而不是数量参数。它会丢弃原始Observable开始的那段时间发射的数据,时长和时间单位通过参数指定
将使用最后两个元素(和),而不考虑一旦遇到就知道产品了。
问题内容: 这与如何在Stream上短路减少有本质上相同的问题?。但是,由于该问题集中在布尔值流上,并且其答案不能推广到其他类型并减少操作,因此我想提出一个更笼统的问题。 我们如何对流进行还原,以使其在遇到用于还原操作的吸收元素时短路? 对于乘法,典型的数学情况将为0。这: 无论遇到什么事实产品都会被知道,它将消耗最后两个元素(和)。 问题答案: 不幸的是,StreamAPI具有有限的功能来创建您
KAG 的操作方法说明如下。 Note 这是通常情况下的操作。虽然根据游戏的不同,也会有些功能不开放,不过把这个直接复制粘贴到游戏说明书里也无所谓吧(汗) 基本的操作 「鼠标左键单击」或「滚轮向下滚动」或「确认键」或「空格键」 显示下一段文字、选择选项、按下按钮、选择勾选框等动作 「鼠标右键单击」或「ESC 键」 打开历史记录,或呼叫右键菜单 「↑」「↓」 或 「←」「→」 或 「TAB」「S
我知道C中的逻辑运算符遵循短路,但我怀疑的是短路和运算符优先规则并不是相互对立的。参见下面的示例: 根据优先级规则,最高优先级为前缀运算符的优先级。因此,应首先计算,然后计算,最后将结果分配给。因此预期输出应为。但在本例中,的第二个操作数从未实际执行,结果是。 为什么这里没有应用优先规则。逻辑运算符是否不受优先规则约束?如果有,还有哪些运营商表现出这样的行为?而这种行为背后的逻辑是什么?