2016-11-25 8 views
5

Ich habe versucht, diesen Code zu Java 8 Streams zu ändern. Mein Code sieht so aus:Konvertieren mit JAVA 8 Streams

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

und ich möchte es in Java 8 Streams konvertieren. Ich habe wie diese begonnen:

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

aber dann weiß ich nicht, ob ich wieder Karte sollte, oder ein Filter verwenden.

+0

Da Sie eine Liste mit Listen haben, benötigen Sie möglicherweise eine flache Karte (siehe z. http://www.adam-bien.com/roller/abien/entry/java_8_flatmap_example), und dann Filter – zm0

+0

@ zm0 Es ist nicht möglich, da was zurückgegeben wird, ist "d", und nicht "m". –

Antwort

2

ein Weg, dies zu handhaben:

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

in diesem Fall ein Nullwert möglich ist.

+0

Können Sie 'isPresent' auf' filter() 'result aufrufen? 'filter() liefert Stream ' nicht ein 'Optional'. Also sollte es sein 'anyMatch (m -> m.getAC(). Enthält (das))' anstelle von 'filter (...). IsPresent()' –

+5

Wirklich. 'anyMatch (Prädikat)' ist vorzuziehen gegenüber 'filter (Prädikat) .findFirst(). isPresent()'. Und wenn Sie find verwenden, verwenden Sie 'findAny (...)', wenn es nicht wichtig ist, das * erste * zu finden. – Holger

4

Andere mögliche Art und Weise ist anyMatch statt zweiten filter

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

Ich weiß nicht, über Ihre Domain zu verwenden, aber es lesbar zu halten, würde ich wahrscheinlich delegieren und zu so etwas wie dies zu vereinfachen:

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

Und dann in der Klasse T, die Delegation Methode hinzufügen:

public boolean containsAC(AC ac) { 
    return m.stream().anyMatch(m -> m.getAC().contains(ac)); 
}