2017-08-08 8 views
5

java8ストリームでmap()メソッドとforEach()メソッドの違いについて混乱しました。例えば、ここでjava8ストリームマップは何ですか?

List<String> strings = Lists.newArrayList("1", "2"); 
Map<String, String> map = Maps.newHashMap(); 
strings.stream().map(s->map.put(s, s)); 
System.out.println(map); 

私はここで空の出力を得たが、私はちょうど

List<String> strings = Lists.newArrayList("1", "2"); 
Map<String, String> map = Maps.newHashMap(); 
strings.stream().forEach(s->map.put(s, s)); 
System.out.println(map); 

ようforEach()にマッピング変更する場合、私は得ることができます

{1 = 1、2 = 2}

なぜmap()メソッドが実行されなかったのですか?彼らの違いは何ですか?

答えて

16
strings.stream().map(s->map.put(s, s)); 

ターミナル操作を実行するまで、ストリームパイプラインは処理されないため、何も実行されません。したがって、Mapは空のままです。ストリームパイプラインに端末操作を追加

map.put(s, s)が端末操作(他のものはStreamのすべての要素を必要とするいくつかの端末操作は、単に一つの要素を必要とする)によって必要Streamの各要素に対して実行されます。

一方、第2のストリームパイプライン: - forEach - Streamの各要素に対して実行される

strings.stream().forEach(s->map.put(s, s)); 

は、端末操作で終了します。

つまり、両方のスニペットではStreamが誤って使用されています。 Streamの内容に基づいてCollectionまたはMapを入力するには、collect()を使用し、MapまたはCollectionを作成して好きなように入力します。 forEachおよびmapは、異なる目的を有する。 Mapを作成するために、例えば

List<String> strings = Lists.newArrayList("1", "2"); 
Map<String, String> map = strings.stream() 
           .collect(Collectors.toMap(Function.identity(), 
                  Function.identity())); 
System.out.println(map); 
7

違いはこれです:

  • forEach()のアイデアが有することにより、基礎となるコレクション(の各要素の「仕事」であります副作用)、一方、
  • map()は、それぞれのオブジェクトにメソッドを適用することについては、その結果、あなたのstream().map()が何かにならない理由でもある新しいストリームにその

- あなたが離れmap()呼び出しによって作成された新しいストリームをを投げるから!その意味で

は、署名は、二つの方法のは、あなたが言う:

void forEach(BiConsumer<? super K,? super V> action) 

このマップ内の各エントリに対して特定のアクションを実行し、すべてのエントリが処理されるまで

<R> Stream<R> map(Function<? super T,? extends R> mapper) 

このストリームの要素に所定の関数を適用した結果で構成されるストリームを返します。

と記録用:のみmap()ストリーム方法である - forEach()は両方、ストリームおよびコレクション/反復可能オブジェクトのために存在します。

-1

あなたは

stream().collect(Collectors.toMap(s -> s,s -> s)

...またはそれらの線に沿って何か、代わりのstream().map(...)

を使用する必要があります
関連する問題