是否有一种优雅的方法来初始化并使用Optional来返回可空字段的值

时间:2017-07-31 13:23:55

标签: java java-8 optional

我有一段代码返回一个字段的值,但也初始化它:

public Observable<Integer> asObservable() {
    if (subject == null) {
        subject = BehaviorSubject.createDefault(0);
    }
    return subject;
}

我尝试使用Optional类来避免if语句:

public Observable<Integer> asObservableWithOptional() {
    Optional.ofNullable(subject)
            .executeIfAbsent(() -> BehaviorSubject.createDefault(0));
    return subject;
}

Hovewer我仍然不满意这段代码。有没有办法只用一个语句把这个方法变成一个?类似于以下的内容无法正常工作,因为subject在调用ofNullable工厂方法期间尚未初始化:

    return Optional.ofNullable(subject)
            .executeIfAbsent(() -> BehaviorSubject.createDefault(0))
            .get();

注意:我没有使用原始Java8 API,而是使用此API {3}的aNNiMON端口。

2 个答案:

答案 0 :(得分:7)

怎么样

return subject = Optional.ofNullable(subject).orElseGet(() -> BehaviorSubject.createDefault(0));

当然,您可以使用三元条件运算符而不是创建Optional只是为了立即丢弃它:

return subject != null ? subject : (subject = BehaviorSubject.createDefault(0));

答案 1 :(得分:2)

我会建议这样的事情:

return (subject == null ? (subject = BehaviorSubject.createDefault(0)) : subject);