Java 如何包装返回可选<;T>;用fromNullable?
我有一个不属于我的方法,它返回null,但返回类型是可选的。当我调用x.IsPresent()时,它抛出(场景2)。我尝试将该方法包装为fromNullable,但得到了类型不匹配的结果(下面的屏幕截图)。如何修复IsPresent()不抛出的问题Java 如何包装返回可选<;T>;用fromNullable?,java,guava,optional,Java,Guava,Optional,我有一个不属于我的方法,它返回null,但返回类型是可选的。当我调用x.IsPresent()时,它抛出(场景2)。我尝试将该方法包装为fromNullable,但得到了类型不匹配的结果(下面的屏幕截图)。如何修复IsPresent()不抛出的问题 import com.google.common.base.Optional; private Optional<Boolean> get_I_dontHaveControlOverThisMethod () { return
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;
}
import com.google.common.base.Optional;
私有可选get\u I\u donthaveControlVerthis方法(){
返回null;//oops!
}
//编译错误?-------------------------->VVVVVVVVVVVVVVVVV
Optional x=Optional.fromNullable(get_I_donthaveControlVerthisMethod());
//(#1)可选x=可选。fromNullable(null);// 可选的类型。fromNullable(get_I_donthaveControlVerthisMethod())
将是可选的,而不是可选的 使用
Optional<Boolean> x = get_I_dontHaveControlOverThisMethod();
if(x == null) x = Optional.absent();
可选x=get_I_donthaveControlVerthisMethod();
如果(x==null)x=Optional.缺席();
如果您经常调用此类方法,可以将其包装为函数:
static <T> Optional<T> safeOptional(Optional<T> optional) {
return optional == null ? Optional.absent() : optional;
}
静态可选安全可选(可选){
return optional==null?可选。缺席():可选;
}
和使用:
Optional<Boolean> x = safeOptional(get_I_dontHaveControlOverThisMethod());
Optional x=safeOptional(get_I_donthaveControlVerthisMethod());
您可以使用或(Optional.缺席())
来“展开”或“展平”可选的
:
Optional x=Optional.fromNullable(get_I_donthaveControlVerthisMethod())
.或(可选。缺席());
非常酷!我喜欢这种方法!如果将其内置到库中就好了,因为在我看来,必须检查可选变量是否为null会破坏可选语义的全部目的。然而,这只是向您展示了一个第三方方法,它说它将返回可选的,您永远不会相信它。这不使用任何Java 8,但是,您可能应该使用Java 8可选的,而不是Guava可选的。
Optional<Boolean> x = Optional.fromNullable(get_I_dontHaveControlOverThisMethod())
.or(Optional.<Boolean>absent());