2017-07-28 10 views
2

私はストリーム上にあるすべての整数を取得しようとしていますが、後で使用する整数の新しいストリームに本質的に追加されています。整数の新しいストリームを移入する複数のIntStreamに結合する

、私のような、IntStreamビルダーを使用して新しいものにそれらを追加し、複数のIntStreamsを作り、:

IntStream rightSide = IntStream.range(8, this.rows.getSlotAmount()).map(value -> value + 9); 
    IntStream leftSide = IntStream.range(0, this.rows.getSlotAmount()).map(value -> value % 9); 
    IntStream top = IntStream.range(0, 9); 
    IntStream bottom = IntStream.range(this.rows.getSlotAmount() - 9, this.rows.getSlotAmount()); 

    IntStream.Builder slots = IntStream.builder(); 

    rightSide.forEach(slots::add); 
    leftSide.forEach(slots::add); 
    top.forEach(slots::add); 
    bottom.forEach(slots::add); 

    slots.build().forEach(this::methodReference); 

これにアプローチするより良い方法はあります

+0

その後、一緒にそれらの2に参加あなたは#のCONCAT() 'をuse'IntStreamでしたが、それだけで2つのストリームを受け入れ... – Lino

+0

が、すべての4つに参加する方が良いだろう、と2 IntStreamsを持っている(基本的に完全に3つのストリームを持ちます)結果の値を操作しますか? –

+0

'IntStream.concat(IntStream.concat(rightSide、leftSide)、IntStream.concat(top、bottom))'を使うことができます。これは、より多くのストリームで拡張されないので、ストリームがもっと多い場合は、 'Stream.of(...).flatMapToInt(x - > x)'が良いでしょう。もう1つの方法は、1つのストリームを作成することを忘れることです。あなたの例では、各ストリームで 'forEach(slots :: add);を呼び出し、結果のストリームに対して' .forEach(this :: methodReference); 'を呼び出すだけです。最初に4つのストリームのそれぞれで '.forEach(this :: methodReference); 'を実行しないと... – Holger

答えて

4

複数のストリームを見るたびに、私はフラットについて考える。それが役に立てば幸い。

Stream.of(rightSide, leftSide, top, bottom).flatMapToInt(x -> x) 
+0

はい、解決策の1つが見つかりました。グアバのように、複数のストリームを結合するのと同様の方法があります。ありがとう。 –