2016-06-22 13 views
4

Ich habe eine Klassenstruktur wie folgt aus:Optional Erste Feld

public class Foo { 
    private FooB foob; 

    public Optional<FooB> getFoob() { 
     return Optional.ofNullable(foob); 
    } 
} 

public class FooB { 
    private int valA; 

    public int getValA() { 
     return valA; 
    } 
} 

Mein Ziel ist es, die get-Methode für fooB zu rufen und dann zu überprüfen, um zu sehen, ob es vorhanden ist. Wenn es vorhanden ist, geben Sie die valA -Eigenschaft zurück, wenn sie nicht null zurückgibt. So etwas wie folgt aus:

Integer valA = foo.getFoob().ifPresent(getValA()).orElse(null); 

Natürlich ist dies nicht die richtige Java 8 optionale Syntax aber das ist meine „Pseudo-Code“. Gibt es eine Möglichkeit, dies in Java 8 mit 1 Zeile zu erreichen?

Antwort

15

Was Sie beschreiben, ist die map Methode:

Integer valA = foo.getFoob().map(f -> f.getValA()).orElse(null); 

map können Sie den Wert innerhalb eines Optional mit einer Transformationsfunktion, wenn der Wert vorhanden ist, und ändert sich nur die Art des optionalen, wenn der Wert in nicht anwesend.

Beachten Sie auch, dass Sie null von der Mapping-Funktion zurückgeben können. In diesem Fall lautet das Ergebnis Optional.empty().

+8

Reife Kandidat für die Verwendung einer Methodenreferenz stattdessen; '.map (FooB :: getValA)'. –

1

Warum fügen Sie der Klasse Foo keine getValue Methode hinzu? Dies wäre eine Art Delegation.

public class Foo { 
    ... 
    public Integer getValue() { 
     if (foob == null) { 
      return null; 
     } 
     return foob.getValA(); 
    } 
}