Streamsはストリーム上でterminalメソッドが呼び出されるまで遅延していると理解しています。 私が知っているのは、terminalメソッドが呼ばれた後、すべての中間メソッドが呼び出される順に実行されるということです。Lazy EvaluationとEager EvaluationはJavaでどのように動作するのですか?
しかし、以下のプログラムでは、ストリームがどのように動作しているかを頭に浮かべることはできません。ここにコードがありますが、私は試しました。
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");
}
}
次のように私は、ストリームのspliteratorに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からストリーム上と後ろをフィルタリングするためにどのように流れますか?
['tryAdvance()'](https://docs.oracle.com/javase/8/docs/api/java/util/Spliterator.html#tryAdvance-java.util.function.Consumer - )、なぜそう思うのですか? ---全体のポイントは、 "ストリームを1つの要素で進めようとする"ことであり、その上で所定のアクションを実行します。 *一度に1つの要素!* – Andreas