2015-11-14 87 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