2016-10-31 11 views
1

ストリーム を平坦化私は四半期(2015年Q1)、四半期(2015、Q2)を返す必要があります のJava 8:

年(2105、2016)指定された年の間に年に四半期のデカルト積を行いたいと思います。 ..四半期(2016年、Q4)

四半期を表す列挙型が

public enum Quarters { 
    Q1, Q2, Q3, Q4 
} 

と以下のように貼り付けられると、私が思い付くしようとしているコードになり

IntStream.rangeClosed(this.getYear(), to.getYear()) 
    .boxed() 
    .map(i -> Arrays 
     .stream(Quarters.values()) 
     .map(q -> new Quarter(i, q)) 
    ); 

上記コード返信Stream<Stream<Quarter>>私はStream<Quarter>に平らにする必要があります任意のヘルプが評価されます。

+1

「flatMap」を使用しますか? –

+1

また、[Java 8のmapとflatMapの違いは何ですか?](http://stackoverflow.com/questions/26684562/whats-the-difference-between-map-and-flatmap-methods-in-java -8?noredirect = 1&lq = 1) –

答えて

4

あなたはStream<Quarter>にごStream<Stream<Quarter>>を平らにするflatMapを使用することができます。

IntStream.rangeClosed(this.getYear(), to.getYear()) 
    .boxed() 
    .map(i -> Arrays 
     .stream(Quarters.values()) 
     .map(q -> new Quarter(i, q)) 
     .flatMap(Function.identity()) 
    ); 

flatMapのボディは、単に恒等関数になります。

あるいは、アレクシスが示唆されているように、あなたが代わりに直接mapflatMapを使用することができます。

IntStream.rangeClosed(this.getYear(), to.getYear()) 
    .boxed() 
    .flatMap(i -> Arrays 
     .stream(Quarters.values()) 
     .map(q -> new Quarter(i, q)) 
    ); 
+6

'map(...)の代わりに' flatMap(...) 'を使用してください。flatMap(identity()) –

+0

@AlexisC。良い点、ありがとう! – Eran

+0

最初のスニペットで試したときにコンパイルエラーが発生しました。flatMapはうまく動作していますが、単体テストではありませんが、うまくコンパイルされています。 –

1

flatMap(i -> i)は、基本的にストリームを連結します。