如何用 fromNullable 包装 returns 可选 <T> 的方法?

How to wrap a method that returns an optional <T> with fromNullable?

我有一个不属于我的方法 returning null 但 return 类型是 Optional。当我调用 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;
}

Optional.fromNullable(get_I_dontHaveControlOverThisMethod()) 的类型将是 Optional<Optional<Boolean>>,而不是 Optional<Boolean>

使用

Optional<Boolean> x = get_I_dontHaveControlOverThisMethod();
if(x == null) x = Optional.absent();

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

static <T> Optional<T> safeOptional(Optional<T> optional) {
    return optional == null ? Optional.absent() : optional;
}

并使用:

Optional<Boolean> x = safeOptional(get_I_dontHaveControlOverThisMethod());

您可以 "unwrap" 或 "flatten" Optional<Optional<Boolean>>.or(Optional.<Boolean>absent()):

Optional<Boolean> x = Optional.fromNullable(get_I_dontHaveControlOverThisMethod())
            .or(Optional.<Boolean>absent());