Stream的SKIP方法可以使无限流有限吗?

时间:2019-03-18 05:51:33

标签: java java-8 java-stream ocpjp

limit()skip()方法使Stream变小。它们可以使有限流变小,或者它们可以从无限流中形成有限流< / em>。方法签名如下所示:

Stream<T> limit(int maxSize)
Stream<T> skip(int n)

以下代码c ....”

以上摘录自OCP Java 8书。当它说“ 可以从无限流中产生有限流”时,它们是在这两种方法中是一起使用还是单独使用?我可以想象limit()将如何使无限流变小,但是仅skip()会如何实现?有什么方法或文档中的措词需要更清楚吗?

2 个答案:

答案 0 :(得分:4)

“可以从无限流中产生有限流” 当然仅适用于limit(),而不适用于skip()

skip就像是从海洋中拿出一杯水,想知道“海洋中还剩下多少水?”,而limit就像是从海洋中拿出同一杯水,想知道“我从海洋中吸收了多少水?”

如果流是无限的,那么跳过许多元素仍然会留下无限的流...

Stream.iterate(0L, i -> i + 1).skip(100).forEach(System.out::println);

从理论上讲,这将永远持续下去。因此,很有可能只是轻微的错误而使书的审稿人逃脱了。

答案 1 :(得分:2)

如果仔细查看Java文档,您会发现对于limit(long maxSize),它是短路操作。这意味着一旦满足给定条件,它就可能不会对源流的所有元素进行操作。因此,这可以将无限流更改为有限流。

  

返回由该流的元素组成的流,被截断   长度不能超过maxSize。

     

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

另一方面,skip(long n)方法没有这样的要求,因此基本上,在跳过n个元素之后,Stream仍然可以是无限的:

  

返回由该流的其余元素组成的流   丢弃流的前n个元素后。如果此流   包含少于n个元素,则将返回空流。

     

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

因此,您正在阅读的书的skip方法措词不正确。