議論のために、例を少し再フォーマットしましょう。
long runCount = 0L;
myStream.stream()
.filter(...)
.forEach(item -> {
foo();
bar();
runCount++;
});
System.out.println("The lambda ran " + runCount + " times");
あなたがいる場合、実際にラムダ内からカウンタをインクリメントする必要があり、そうするための典型的な方法は、カウンタを作るANにあるAtomicInteger
か、AtomicLong
そして、それにインクリメント方法のいずれかを呼び出します。
単一の要素int
またはlong
配列を使用することもできますが、ストリームが並行して実行される場合、競合状態が発生します。
ただし、ストリームがで終わることに注意してくださいforEach
。これは、戻り値がないことを意味します。をに変更するforEach
とpeek
、アイテムが通過し、カウントされます。
long runCount = myStream.stream()
.filter(...)
.peek(item -> {
foo();
bar();
})
.count();
System.out.println("The lambda ran " + runCount + " times");
これはやや良いですが、それでも少し奇妙です。その理由は、ということですforEach
し、peek
唯一の副作用を経由して自分の仕事を行うことができます。Java 8の新しい機能スタイルは、副作用を回避することです。カウンターの増分をcount
ストリームの操作に抽出することで、その少しを実行しました。その他の典型的な副作用は、コレクションへのアイテムの追加です。通常、これらはコレクターを使用して置き換えることができます。しかし、あなたが実際にどのような仕事をしようとしているのかを知らなければ、これ以上具体的なことを提案することはできません。