首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >skip()方法是短路操作吗?

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

Stack Overflow用户
提问于 2018-07-28 13:37:22
回答 2查看 294关注 0票数 9

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

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-07-28 13:48:52

来自java文档中的"Stream操作和管道“部分

--一种中间操作是短路的,如果当呈现无限输入时,它可能产生有限的流作为结果,。如果在无限输入的情况下,终端操作在有限的时间内终止,则终端操作是短路的。

强调我的。

如果要对无限输入调用skip,它不会产生有限的流,因此不会产生短路操作。

JDK8中唯一的短路中间操作是limit,因为它允许在有限的时间内完成对无限流的计算。

示例:

如果您要使用skip来执行这个程序

代码语言:javascript
复制
String[] skip = Stream.generate(() -> "test") // returns an infinite stream
                      .skip(20) 
                      .toArray(String[]::new);

它不会产生有限的流,因此您最终会得到一些类似于"java.lang.OutOfMemoryError: Java堆空间“的内容。

然而,如果使用limit执行此程序,则将导致计算在finite时间内完成:

代码语言:javascript
复制
String[] limit = Stream.generate(() -> "test") // returns an infinite stream
                       .limit(20)
                       .toArray(String[]::new);
票数 17
EN

Stack Overflow用户

发布于 2018-07-28 21:25:38

只想在这里加上我的两分钱,这个关于短路流的一般想法是无限复杂的(至少对我来说,至少在我的意义上,我必须划破我的头两次)。我将在答案的末尾到达skip

让我们以这个为例:

代码语言:javascript
复制
Stream.generate(() -> Integer.MAX_VALUE);

这是一条无限的溪流,我们都可以在这一点上达成一致。让我们通过一个记录在案的操作短路(与skip不同):

代码语言:javascript
复制
Stream.generate(() -> Integer.MAX_VALUE).anyMatch(x -> true);

这很好,添加一个filter怎么样?

代码语言:javascript
复制
Stream.generate(() -> Integer.MAX_VALUE)
      .filter(x -> x < 100) // well sort of useless...
      .anyMatch(x -> true);

这里会发生什么?嗯,这从来没有结束,即使有一个短路操作,如anyMatch -但它从来没有达到真正的短路任何东西。

另一方面,filter不是短路操作,但您可以这样做(就像一个例子):

代码语言:javascript
复制
someList.stream()
        .filter(x -> {
           if(x > 3) throw AssertionError("Just because");            
})

是的,很丑,但它短路了.这就是我们(强调我们,因为很多人不同意)实现short-circuiting reduce的方式-抛出一个没有堆栈跟踪的异常。

java-9中,增加了另一个短路的中间操作:takeWhile,它的作用有点像limit,但有一定的条件。

公平地说,关于skip的大部分答案已经是由Aomine给出的,但最简单的答案是,它没有这样的文档。通常(有些情况下文档会被更正),但这是您应该查看的第一项指示。例如,请参见limittakeWhile,它们清楚地写着:

这是一个短路有状态的中间操作。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51571912

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档