2016-11-25 104 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

由於您有列表清單,因此您可能需要平面地圖(請參閱http://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(); 
在這種情況下,空值是可能

+0

你能在'filter()'結果上調用'isPresent'嗎? 'filter()返回流'不是'Optional'。所以它應該是'anyMatch(m - > m.getAC()。contains(this))'而不是'filter(...)。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)); 
}