首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Java 8中,延迟评估和急切评估是如何工作的

在Java 8中,延迟评估和急切评估是如何工作的
EN

Stack Overflow用户
提问于 2016-11-04 00:38:57
回答 1查看 2.5K关注 0票数 3

我知道流是懒惰的,直到在流上调用终端方法。我所知道的是,在调用终端方法之后,所有中间方法都按照调用顺序执行。

但是有了下面的程序,我无法理解流是如何工作的。这是密码,我试过了。

代码语言:javascript
复制
import java.util.*;
import java.util.stream.*;

class TestEagerLazy
{
    public static void main(String[] args) {
        ArrayList<Integer> a = new ArrayList<>();

        a.add(4);a.add(5);a.add(8);
        a.add(7);a.add(3);a.add(65);
        a.add(87);a.add(2);a.add(12);
        a.add(58);a.add(42);

        Stream<Integer> st = a.stream().filter(b->{System.out.println("Tested: " + b);return (b%2)==0;});

        Spliterator<Integer> it = st.spliterator();

        System.out.println("\n\nIterator Results:");
        while(it.tryAdvance((j)->System.out.println("iter: "+j)));


        System.out.println("Last Statement");


    }
}

假设流的分配器上有tryAdvance,我期望的输出如下:

代码语言:javascript
复制
Iterator Results:
Tested: 4
Tested: 5
Tested: 8
Tested: 7
Tested: 3
Tested: 65
Tested: 87
Tested: 2
Tested: 12
Tested: 58
Tested: 42
iter: 4
iter: 8
iter: 2
iter: 12
iter: 58
iter: 42
Last Statement

但我得到的输出如下:

代码语言:javascript
复制
Iterator Results:
Tested: 4
iter: 4
Tested: 5
Tested: 8
iter: 8
Tested: 7
Tested: 3
Tested: 65
Tested: 87
Tested: 2
iter: 2
Tested: 12
iter: 12
Tested: 58
iter: 58
Tested: 42
iter: 42
Last Statement

确切的程序流程是什么?程序是如何从tryAdvance流到流和返回过滤器的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-04 00:53:47

无状态流被设计为处理可能无限数量的元素。为了做到这一点,流不能一次尝试对所有元素的每个操作进行评估。

顺序流总是一次执行一个元素的管道。在下一个元素开始之前,每个元素都要通过整个管道。这就是允许惰性评估有效的原因。它允许流短路,例如与findFirstallMatch.如果在每个阶段同时处理所有元素,流将无法处理无限数据源,例如来自Stream.iterate的数据源。

代码的输出演示了元素一次一个地通过管道:

代码语言:javascript
复制
Iterator Results:
Tested: 4   // starting 1st element
iter: 4     // ending 1st element
Tested: 5   // starting 2nd element (fails the filter)
Tested: 8   // starting 3rd element
iter: 8     // ending 3rd element
Tested: 7   // starting 4th element (fails the filter)
...
Last Statement

这些行为在JavaDoc中有更广泛的解释。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40413560

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档