2016-11-25 7 views
5

このコードをJava 8ストリームに変更しようとしました。私のコードは次のようになります:JAVA 8ストリームを使用して変換

for(D d : n.getD()) { 
    for(M m : d.getT().getM()) { 
     if(m.getAC().contains(this)) { 
      return d; 
     } 
    } 
} 

と私はそれをJava 8ストリームに変換します。

n.getD().stream() 
     .map(m -> m.getT().getM()) 

を私はマップ再び、またはフィルタを使用する必要があるならば、私は知らない。私はこのように始めました。これを処理する

+0

をリストのリストがあるので、フラットマップが必要な場合があります(例: //www.adam-bien.com/roller/abien/entry/java_8_flatmap_example)、フィルタ – zm0

+0

@ zm0返されるものは 'd'であり、' m'ではないので不可能です。 –

答えて

2

一つの方法:この場合

return n.getD().stream().filter(d -> d.getT().getM().stream().filter(m -> m.getAC().contains(this)).findFirst().isPresent()).findFirst(); 

NULL値が可能です。

+0

'filter()'の結果に 'isPresent'を呼び出すことができますか? 'filter()は' Optional'ではなくStream を返します。ですから、 'filter(...)の代わりに' anyMatch(m - > m.getAC()。contains(this)) 'にする必要があります。isPresent()' –

+5

本当に。 'anyMatch(predicate)'は 'filter(predicate).findFirst()。isPresent()'よりも望ましいです。そしてfindを使うなら、* first *を見つけることが重要でないときはいつでも 'findAny(...)'を使ってください。 – Holger

4

他の可能な方法はanyMatchの代わりに、二filter

return n.getD().stream().filter(
    d -> d.getT().getM().stream().anyMatch(
     m -> m.getAC().contains(this) 
    ) 
).findFirst(); // result will be Optional<D> 
1

を使用することです私は自分のドメインのことは知らないが、私はおそらく委任し、このような何かに単純化読める、それを維持するために:

return n.getD().stream() 
       .filter(d -> d.getT().containsAC(this)) 
       .findFirst() 
       .orElse(null); 

そしてクラスTに委譲メソッドを追加:

public boolean containsAC(AC ac) { 
    return m.stream().anyMatch(m -> m.getAC().contains(ac)); 
} 
関連する問題