2016-08-04 48 views
2

我有一個類的結構是這樣的:的Java 8可選得到,如果現在

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; 
    } 
} 

我想要做的是這樣的:

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

基本上,如果foo的對象返回FooB爲存在然後從FooB獲取字段String a並將其存儲在本地變量String a中。我怎樣才能做到這一點在1線優雅?

+5

的問題是:你想發生,如果什麼'可選'是空的?這正是可選的目的:迫使你考慮這種情況。 – Tunaki

+1

'ifPresent()'需要一個不能返回任何東西的消費者。雖然你可以給它一個有狀態的消費者,但最好使用'map()'來閱讀。你只需要再次處理產生的'Optional ':'String a = foo.getFooB().map(FooB :: getA).orElse(null);' – eckes

回答

6

由於getFooB()返回Optional<FooB>一個實例,得到的getA()相應的值,你需要使用map方法,下一個:

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

這太可怕了。並且假定OP在「可選」爲空時想要「空」。 – Tunaki

+0

編輯後是不是很可怕? –

+0

沒有。對於''Optional',有'map'操作。 – Tunaki