“ limit()
和skip()
方法使Stream
变小。它们可以使有限流变小,或者它们可以从无限流中形成有限流< / em>。方法签名如下所示:
Stream<T> limit(int maxSize)
Stream<T> skip(int n)
以下代码c ....”
以上摘录自OCP Java 8书。当它说“ 可以从无限流中产生有限流”时,它们是在这两种方法中是一起使用还是单独使用?我可以想象limit()
将如何使无限流变小,但是仅skip()
会如何实现?有什么方法或文档中的措词需要更清楚吗?
答案 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
方法措词不正确。