gpt4 book ai didi

java - Lazy Evaluation 和 Eager Evaluation 如何在 Java 8 中工作

转载 作者:塔克拉玛干 更新时间:2023-11-01 23:05:48 27 4
gpt4 key购买 nike

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

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

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 中有更一般的解释。 .

关于java - Lazy Evaluation 和 Eager Evaluation 如何在 Java 8 中工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40413560/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com