[英]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流向流並返回過濾。
無狀態流旨在處理可能無限數量的元素。 為此,流不能嘗試一次評估所有元素上的每個操作。
順序流始終每次一次在管道上執行一個元素。 每個元素在下一個元素開始之前都要經過整個管道。 這就是使惰性評估有效的原因。 它允許流短路,例如使用findFirst
或allMatch
。 如果在每個階段一次處理所有元素,則流將無法處理無限數據源,例如來自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.