2015-11-14 88 views
0

是否可以測試Optional並返回1)正在測試的實例的子字段(或方法)或2)如果正在測試的實例是null空值?使用java.util.Optional爲可選類型的子字段返回空值

下面是一個例子(沒有編譯):

public static void main(String[] args) { 

    A a1 = null; 

    LocalDate a_date_field = Optional.ofNullable(a1).orElse(???).date; // <--- I need this line ... 
    LocalDate a_date_field = a1 == null? null : a1.date; // <---- ... to work like this line 
} 

static class A { 
    LocalDate date = LocalDate.now(); 
} 

是的,你可以用一個新的實例提供Optional::orElse()

LocalDate a_date_field = Optional.ofNullable(a1).orElse(new A()).date; 

但是,這僅僅是不正確。由於a爲空,因此a_date_field也應該爲空。

null供應領域顯然是行不通的:

String afield = Optional.ofNullable(a1).orElse(null).field; 

此拋出NPE。

這可能與Optional

回答

2

使用map(Function<? super T,? extends U> mapper)

LocalDate a_date_field = Optional.ofNullable(a1) 
           .map(a -> a.date) 
           .orElse(null); 

另一個有趣的方法是說,你要now()如果a1爲null,通過使用orElseGet(Supplier<? extends T> other)

LocalDate a_date_field = Optional.ofNullable(a1) 
           .map(a -> a.date) 
           .orElseGet(() -> LocalDate.now()); 

還是較短的形式:

        .orElseGet(LocalDate::now); 

請注意,orElseorElseGet適用於a1 == nulla1.date == null