是否可以测试Optional
并返回1)正在测试的实例的子字段(或方法),或者2)如果被测试的实例为空,则返回null?
这是一个例子(不编译):
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
吗?
答案 0 :(得分:2)
使用map(Function<? super T,? extends U> mapper)
LocalDate a_date_field = Optional.ofNullable(a1)
.map(a -> a.date)
.orElse(null);
另一种有趣的方法是,如果now()
为空,则需要a1
,方法是使用orElseGet(Supplier<? extends T> other)
:
LocalDate a_date_field = Optional.ofNullable(a1)
.map(a -> a.date)
.orElseGet(() -> LocalDate.now());
或更短的形式:
.orElseGet(LocalDate::now);
请注意,orElse
和orElseGet
适用于a1 == null
和a1.date == null
。