2016-09-01 14 views
1

Java Stream APIを使用して次のステートメントをどのように減らすことができますか?あなたは、ネストされたストリームを平らにするflatMapを使用することができます内部メソッドの結果をカスケードストリームで返す方法

Optional<Inner> result = outerList.forEach(middle -> 
    middle.stream() 
    .filter(middle.getResultForCode(code)) 
    .findFirst()); 
+1

'outerList.stream()のようなものがflatMap - \t .MAP(中央 - > middle.getResultForCode(コード))(オブジェクトをフィルタリングする。(外> outer.getMiddleList()ストリーム()): :nonNull).findFirst()。map(Inner :: getRelevantThing).orElse(null) '? –

答えて

3

String code = "searchcode"; 
Inner result; 
for (Outer outer : outerList) { 
     for (Middle middle : outer.getMiddleList()) { 
      Inner inner = middle.getResultForCode(code); 
       if (inner != null) { 
        result = inner; 
       } 
     } 
    } 

は、私が "内側" または "inner.getRelevantThing()" のような

何かを取得したいです。

Optional<Inner> result = outerList.stream() 
    .flatMap(outer -> outer.getMiddleList().stream()) 
    .map(middle -> middle.getResultForCode(code)) 
    .filter(Objects::nonNull) 
    .findAny(); 

(あなたのコードがやったようfindAnyが任意の一致する項目ではなく、最後に一致する項目を見つけることに注意してください。)

あなたは「関連の事を」したい場合は、Optional<Inner>へのマッピングを適用することができます。

outerList.stream() 
    .flatMap(outer -> outer.getMiddleList().stream()) 
    .map(middle -> middle.getResultForCode(code)) 
    .filter(Objects::nonNull) 
    .findAny() 
    .map(Inner::getRelevantThing); 
+0

@ Jean-FrançoisSavard:私はあなたが編集内容を過度に解釈していると思います。ループ・バリアントは明確に1つのアイテムを明確に生成し、編集で挿入された誤ったコードが正しいループ・コードよりもOPの意図を反映することはありそうにありません。 – Holger

+0

@Holger実際には、再読、私は両方が正しいと思います。ほとんどのOPはループコードからストリームソリューションに直接変換しようとする 'foreach 'を使用しました。 + 1ed。 –

+0

完全性のためには、OPのコードのように実際に動作するには、ループコードが単純な 'findAny'のように動作しないので、逆パイプラインを作成してからfindFirstを書くべきです。次のようなものがあります: 'IntStream.range(0、outerList.size() - 1).mapToObj(i - outerList.get(outerList.size() - 1 - i).getMiddleList())。map(middleList - > IntStream (中間 - > middle.getResultForCode(コード))。の範囲(0、middleList.size() - 1).mapToObj(i - > middleList.get(middleList.size() - 1 - i) Objects :: nonNull).findFirst()) '...しかしOPのコードには欠陥がある可能性が高いです。 –

関連する問題