2016-06-22 35 views
4

我有一個類的結構是這樣的:可選獲取現場

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

我的目標是調用get方法fooB,然後檢查,看它是否是存在。如果它存在,則返回valA屬性,如果不存在,則返回null。所以像這樣:

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

當然,這是不正確的Java 8可選語法,但這是我的「僞代碼」。有沒有什麼辦法可以在Java 8中用1行來實現這一點?

回答

15

你所描述的是map方法:

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

map讓你變換的值的Optional內部與函數值是否存在,並且僅改變可選如果在值的類型不存在。

還要注意,您可以從映射函數返回null,在這種情況下結果將是Optional.empty()

+8

取而代之使用方法引用的成熟候選者; '.MAP(FooB :: getValA)'。 –

1

爲什麼你不添加getValue方法Foo?這將是一種授權。

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