我不理解IntStream api,我也没有找到任何解释

时间:2016-12-01 11:34:38

标签: java functional-programming java-8

[来自http://www.deadcoderising.com/2015-05-19-java-8-replace-traditional-for-loops-with-intstreams/]

IntStream.iterate(0, i -> i + 2).limit(3);  

如果“迭代”和“限制”是常规函数,怎么能“限制”实际停止“迭代”运行到无限循环?

在教授函数式编程时没有人解释

如果它出现了某种出生的明显公理,我还没有被告知或者其他事情: - )

安静令人沮丧,就像他们一直说FP让事情变得一成不变,我不知道其中有什么是不可改变的

他们也说它确实是无国籍的,但最终所有应用程序都需要状态

1 个答案:

答案 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