如何使用fromNullable包装返回可选<T>的方法?

gen*_*eek 2 java optional guava

我有一个我不拥有的方法,返回null但返回类型是Optional <Boolean>.当我调用x.IsPresent()时它会抛出(场景#2).我尝试将方法包装在fromNullable中但是我得到了类型不匹配(下面的屏幕截图).我如何修复,以便IsPresent()不抛出?

import com.google.common.base.Optional;

private Optional<Boolean> get_I_dontHaveControlOverThisMethod () {
    return null;  // Ooops!
}

// Compile error? ----------------------->  vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
Optional<Boolean> x = Optional.fromNullable(get_I_dontHaveControlOverThisMethod());   
// (#1) Optional<Boolean> x = Optional.fromNullable(null);  // <- this work fine
// (#2) Optional<Boolean> x = get_I_dontHaveControlOverThisMethod();
if (x.isPresent()) {   // <- this blows up!  NPE when (#2) runs
    // non-null good value;
}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

Tag*_*eev 5

使用

Optional<Boolean> x = get_I_dontHaveControlOverThisMethod();
if(x == null) x = Optional.absent();
Run Code Online (Sandbox Code Playgroud)

如果你经常调用这样的方法,你可以将它包装成函数:

static <T> Optional<T> safeOptional(Optional<T> optional) {
    return optional == null ? Optional.absent() : optional;
}
Run Code Online (Sandbox Code Playgroud)

并使用:

Optional<Boolean> x = safeOptional(get_I_dontHaveControlOverThisMethod());
Run Code Online (Sandbox Code Playgroud)