2016-08-04 10 views
2

ich eine Klassenstruktur wie diese:Java 8 Optional erhalten, wenn vorhanden

public class Foo { 
    private FooB fooB; 

    public Optional<FooB> getFooB() { 
     return Optional.ofNullable(fooB); 
    } 
} 

public class FooB { 
    private String a; 
    private String b; 

    public String getA() { 
     return a; 
    } 

    public String getB() { 
     return b; 
    } 
} 

Was will ich so etwas wie dies zu tun ist:

main() { 
    //initialize a Foo object called foo 
    String a = foo.getFooB().ifPresent(FooB::getA); 
} 

Grundsätzlich, wenn das Objekt foo Foob als Geschenk zurück Holen Sie dann das Feld String a von FooB und speichern Sie es in der lokalen Variablen String a. Wie kann ich das elegant in 1 Zeile machen?

+5

Die Frage ist: Was Sie passieren soll, wenn 'Optional ' ist leer? Genau dafür ist Optional: Zwing dich dazu, über diesen Fall nachzudenken. – Tunaki

+1

'ifPresent()' benötigt einen Verbraucher, der nichts zurückgeben kann. Während Sie es einem statusbehafteten Verbraucher geben könnten, ist es wahrscheinlich besser, zu lesen, um 'map()' zu verwenden. Sie müssen sich nur noch mit dem resultierenden 'Optional ' befassen: 'String a = foo.getFooB(). Map (FooB :: getA) .oderElse (null);' – eckes

Antwort

6

Als getFooB() gibt eine Instanz von Optional<FooB>, den entsprechenden Wert von getA() zu erhalten, müssen Sie die map Methode als nächste verwenden:

Optional<String> a = foo.getFooB().map(FooB::getA); 
-3
String a = foo.getFooB().isPresent() ? foo.getFooB().get().getA() : {absolutely anything your heart desires if FooB doesn't exist}; 
+0

Das ist schrecklich. Und es nimmt an, dass OP "null" haben will, wenn das Optional leer ist. – Tunaki

+0

ist es weniger schlimm nach meiner Bearbeitung? –

+0

Nein. Es gibt die 'map' Operation für' Optional'. – Tunaki

Verwandte Themen