Java 如何包装返回可选<;T>;用fromNullable?

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

我有一个不属于我的方法,它返回null,但返回类型是可选的。当我调用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;
}
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());