繁体   English   中英

懒惰评估和急切评估在Java 8中如何工作

[英]How does Lazy Evaluation and Eager Evaluation work in Java 8

我知道在流上调用终端方法之前,流是惰性的。 我所知道的是,在调用终端方法后,所有中间方法均按其调用顺序执行。

但是,使用以下程序,我无法理解流的工作方式。 这是我尝试过的代码。

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,我期望的输出如下:

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

但是我得到的输出如下:

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流向流并返回过滤。

无状态流旨在处理可能无限数量的元素。 为此,流不能尝试一次评估所有元素上的每个操作。

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

代码的输出说明元素一次通过一个管道:

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中进行了更一般的解释。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM