[来自http://www.deadcoderising.com/2015-05-19-java-8-replace-traditional-for-loops-with-intstreams/]
IntStream.iterate(0, i -> i + 2).limit(3);
如果“迭代”和“限制”是常规函数,怎么能“限制”实际停止“迭代”运行到无限循环?
在教授函数式编程时没有人解释 如果它出现了某种出生的明显公理,我还没有被告知或者其他事情: - )安静令人沮丧,就像他们一直说FP让事情变得一成不变,我不知道其中有什么是不可改变的
他们也说它确实是无国籍的,但最终所有应用程序都需要状态答案 0 :(得分:1)
interate
是一个流源,limit
是一个中间操作。我们必须记住关于中间操作的两个重要事项:它们返回一个新的Stream
并且它们总是很懒惰。因此,limit
将返回由原始流Stream
的元素组成的新IntStream.iterate(0, i -> i + 2)
,其截断长度不超过maxSize 3
。懒惰只是意味着除非你添加诸如forEach,count,anyMathch or any other
之类的终端操作,否则什么都不会发生。所以考虑到这一切,我们可以考虑我们的代码
IntStream.iterate(0, i -> i + 2).limit(3).forEach(System.out::println);
就像那样[伪代码]
new LimitedStream(new InfinitiveStream(0, i -> i + 2),3).forEach(print);
在Java-8之前,它看起来或多或少类似于以下
for (int i = 0, limit = 0; ; i += 2, limit++) {
System.out.println(i);
if (limit == 2) {
break;
}
}
一个不定式循环for (int i = 0; i += 2)
,只生成3个元素后才会停止执行limit = 0; ... limit ++; ... if (limit == 2) break