使用java.util.Optional为Optional类型的子字段返回null

时间:2015-11-14 05:07:55

标签: java optional

是否可以测试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吗?

1 个答案:

答案 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);

请注意,orElseorElseGet适用于a1 == nulla1.date == null