当前位置: 首页 > 知识库问答 >
问题:

skip()方法是短路操作吗?

漆雕彬彬
2023-03-14

我正在阅读Java streams的短路操作,在一些文章中发现,skip()是一种短路操作。

在另一篇文章中,他们没有提到短路操作。

现在我很困惑;skip()是短路操作还是不是?

共有2个答案

云俊美
2023-03-14

只想在这里加上我的两分钱,一般来说,让一条流短路的想法是无限复杂的(至少对我来说,至少在这个意义上,我通常要搔两次头)。顺便说一句,我将在回答结束时跳过。

举个例子:

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已经给出的,但最简单的答案是它没有这样的文档记录。一般来说(在某些情况下,文档已更正),但这是您应该注意的首要指示。例如,请参见明确说明:

这是一种短路状态中间操作

长孙兴德
2023-03-14

来自“流操作和管道”部分下的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中的逻辑运算符遵循短路,但我怀疑的是短路和运算符优先规则并不是相互对立的。参见下面的示例: 根据优先级规则,最高优先级为前缀运算符的优先级。因此,应首先计算,然后计算,最后将结果分配给。因此预期输出应为。但在本例中,的第二个操作数从未实际执行,结果是。 为什么这里没有应用优先规则。逻辑运算符是否不受优先规则约束?如果有,还有哪些运营商表现出这样的行为?而这种行为背后的逻辑是什么?