首页 > 解决方案 > skip() 方法是短路操作吗?

问题描述

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

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

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

标签: javajava-8java-streamshort-circuiting

解决方案


来自“流操作和管道”部分下的 java 文档

如果在出现无限输入时,中间操作可能会产生有限流,则它是短路的。如果一个终端操作在有无限输入时可能会在有限时间内终止,那么它就是短路的。

强调我的。

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

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

例子:

如果您要使用以下命令执行此程序skip

String[] skip = Stream.generate(() -> "test") // returns an infinite stream
                      .skip(20) 
                      .toArray(String[]::new);

它不会产生有限的流,因此您最终会得到类似于“java.lang.OutOfMemoryError: Java heap space”的内容。

而如果你使用 来执行这个程序limit,它将导致计算在一段finite时间内完成:

String[] limit = Stream.generate(() -> "test") // returns an infinite stream
                       .limit(20)
                       .toArray(String[]::new);

推荐阅读