如何用 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());
我有一个不属于我的方法 returning null 但 return 类型是 Optional
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());