2016-06-25 3 views
-3

(*)forEachとの違いは何ですか?アウトプットとは何ですか?なぜですか?私はなしで知っているforEach何も印刷されません...しかし、なぜピークが必要ですか?Javaストリームの有無による違い

私はpeekのためにあなたが何かをするSystem.out.printlnため結果ストリームで何かをする必要が知っているように...しかし、ここで行われているようだしない、そしてそれはまだ動作します....

public class NaturalNumbers 
     implements Supplier<Integer> { 
private int i = 0; 
public Integer get() { return ++i; } 
} 

public static void main(String[] args) { 
Stream<Integer> s = 
       Stream.generate(new NaturalNumbers()); 

s.limit(5) 
    .peek(System.out::println) 
    .forEach(System.out::println);/// ׂ (*) 
{ 
+1

*出力とは*:コードを実行して自分で見てみませんか?次に、ドキュメントを読んで理解してください。それぞれを削除したときに何が起こると思われますか?そして、代わりに何が起こりますか? –

+0

ji 'for each'の副作用について最初に確認する必要があると思う(https://docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.html) – emotionlessbananas

答えて

2

peekは、ストリーム内のちょうど方法ですが、ストリーム内では変更されませんが、ストリーム内のすべての要素がピークに表示されます。

forEachは、ストリーム内のすべてのデータを消費し、voidを返すターミナル操作です。

上記のコードの結果は、各番号が2回印刷され、peekを削除すると1回だけ印刷されます。

forEachを削除した場合、端末操作(例:forEachcountなど)が発生するまで、ストリームはアクションを実行しないため、出力はありません。

+0

'forEach'は、ストリームからアイテムを消費する端末アクションがないので、数字は表示されません。 –

+0

@MarkRotteveel右、私はそれを忘れて、私の答えを更新 –

2

端末操作と中間操作の概念があります。 ターミナル操作は最終ステップです。すべての中間操作が処理されます。ピックはターミナル操作ではありません。

Stream.of("one", "two", "three", "four") 
      .filter(e -> e.length() > 3) 
      .peek(e -> System.out.println("Filtered value: " + e)) 
      .map(String::toUpperCase) 
      .peek(e -> System.out.println("Mapped value: " + e)) 
      .collect(Collectors.toList()); 

そして、はい、私は方法のPEEKのjavadocを内側に見て、あなたをお勧めします:また、 https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html

方法は、端末の操作であれば知っている方法 https://docs.oracle.com/javase/tutorial/collections/streams/

この文書を読みますまたは中間体?これは可能な限り簡単です。中間操作は常にStreamクラスを返しますが、端末操作はさまざまなオブジェクトを返すことができます。 - オプションのクラス、いくつかのコレクション、プリミティブなど。

関連する問題