2016-04-24 16 views
4

いただきまし差stream.of()とcollection.stream():flatMap(x->stream.of(x))は、ストリームとflatMap(x->x.stream())作品を平らにせず、望ましい結果を提供します。 誰かが2つの違いを説明できますか?JavaのflatMap - 私は<code>flatMap</code>を理解しようとしている

import java.util.*; 
import java.util.stream.*; 

class TestFlatMap{ 

    public static void main(String args[]){ 
     List<String> l1 = Arrays.asList("a","b"); 
     List<String> l2 = Arrays.asList("c","d"); 

     Stream.of(l1, l2).flatMap((x)->Stream.of(x)).forEach((x)->System.out.println(x)); 

     Stream.of(l1, l2).flatMap((x)->x.stream()).forEach((x)->System.out.println(x)); 
    } 

} 

出力: - x

[a, b] 
[c, d] 
a 
b 
c 
d 

答えて

5

あなたが念頭に置いていた事は、このでした:あなたが期待通りにもa, b, c, dの平坦化されたストリームをもたらすであろう

Stream.of(l1, l2) 
     // String[]::new isn't really needed in this simple example, 
     // but would be in a more complex one... 
     .flatMap((x)->Stream.of(x.toArray(String[]::new))) 
     .forEach((x)->System.out.println(x)); 

。渡すときに、以来配列(ないListあなたは予想通り)

を取っEran

  • Stream.of(T...)でも説明したように

    • Stream.of(T)単一の値を取る:Stream.of()は2種類がありますListStream.of()の場合、適用可能なオーバーロードは単一の値を取るものだけです。予想されるではなくStream<List<String>>です0

  • 6

    Stream.of(x)は、単一の要素のストリームを生成します。したがって、flatMapStream<String>の代わりにStream<List<String>>を返します。一方

    xはあなたのケースでは、flatMapがすべてのすべてString Sを含むStream<String>を生成することを可能にするStream<String>を返すようCollection<E>は、そのソースCollectionの要素であるStream<E>を返すあるx.stream()ソースのList<String>Streamです。

    あなたは、Javadocの中にいることがわかります。

    <T> Stream<T> java.util.stream.Stream.of(T t)
    単一の要素を含むシーケンシャルストリームを返します。そのソースとしてこのコレクションで順次ストリームを返し

    Stream<E> stream()

    関連する問題