我正在阅读Java的短路操作,并在一些文章中发现skip()是一种短路操作。
在另一篇文章中,他们没有提到skip()是短路操作。
现在我很困惑,skip()是短路操作还是非短路操作?
发布于 2018-07-28 13:48:52
--一种中间操作是短路的,如果当呈现无限输入时,它可能产生有限的流作为结果,。如果在无限输入的情况下,终端操作在有限的时间内终止,则终端操作是短路的。
强调我的。
如果要对无限输入调用skip,它不会产生有限的流,因此不会产生短路操作。
JDK8中唯一的短路中间操作是limit,因为它允许在有限的时间内完成对无限流的计算。
示例:
如果您要使用skip来执行这个程序
String[] skip = Stream.generate(() -> "test") // returns an infinite stream
.skip(20)
.toArray(String[]::new);它不会产生有限的流,因此您最终会得到一些类似于"java.lang.OutOfMemoryError: Java堆空间“的内容。
然而,如果使用limit执行此程序,则将导致计算在finite时间内完成:
String[] limit = Stream.generate(() -> "test") // returns an infinite stream
.limit(20)
.toArray(String[]::new);发布于 2018-07-28 21:25:38
只想在这里加上我的两分钱,这个关于短路流的一般想法是无限复杂的(至少对我来说,至少在我的意义上,我必须划破我的头两次)。我将在答案的末尾到达skip。
让我们以这个为例:
Stream.generate(() -> Integer.MAX_VALUE);这是一条无限的溪流,我们都可以在这一点上达成一致。让我们通过一个记录在案的操作短路(与skip不同):
Stream.generate(() -> Integer.MAX_VALUE).anyMatch(x -> true);这很好,添加一个filter怎么样?
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");
})是的,很丑,但它短路了.这就是我们(强调我们,因为很多人不同意)实现short-circuiting reduce的方式-抛出一个没有堆栈跟踪的异常。
在java-9中,增加了另一个短路的中间操作:takeWhile,它的作用有点像limit,但有一定的条件。
公平地说,关于skip的大部分答案已经是由Aomine给出的,但最简单的答案是,它没有这样的文档。通常(有些情况下文档会被更正),但这是您应该查看的第一项指示。例如,请参见limit和takeWhile,它们清楚地写着:
这是一个短路有状态的中间操作。
https://stackoverflow.com/questions/51571912
复制相似问题