在java中安全地从Long对象转换为long原始的惯用方法

Dha*_*eth 7 java

我试图将Long对象值传递给期望长基元的方法,直接传递除了Long对象为空的情况之外.在这种情况下,我得到一个空指针异常.

Long foo=null;
bar.methodExpects_long_primitive(foo);
Run Code Online (Sandbox Code Playgroud)

我可以创建一个检查,如果foo为null并跳过调用方法,就像

Long foo=null;
if(foo!=null){
bar.methodExpects_long_primitive(foo);
}
Run Code Online (Sandbox Code Playgroud)

或者如果我想提供默认值

Long foo=null;
bar.methodExpects_long_primitive(foo==null?defaultValue:foo);
Run Code Online (Sandbox Code Playgroud)

是否有优雅/更好的方法来做到这一点?我必须在代码库中重复多次这样做,这样做似乎增加了很多条件.

我可以创建自己的方法来执行此操作,但我想知道是否已有任何此类库方法.

And*_*mas 3

从 Java 8 开始,一种选择是将 Long 包装在java.util.Optional中。只要有可能,就传递这个而不是 Long。当您必须获取长值时,您可以提供默认值Optional.orElse()

Long foo = null;

Optional<Long> optFoo = Optional.ofNullable( foo );
long longFoo = optFoo.orElse( -1L );

System.out.println( longFoo );
Run Code Online (Sandbox Code Playgroud)

或者您可以测试Optional是否具有以下值Optional.empty()

    Long foo = null;

    Optional<Long> optFoo = Optional.ofNullable( foo );
    if ( ! optFoo.empty() ) {
        long longFoo = optFoo.get();

        System.out.println( longFoo );
    }
Run Code Online (Sandbox Code Playgroud)

这种方法的一个很好的副作用是,很明显,无论您在何处传递可选值,该值都可能为空。另一个是当值为 null 时尝试调用 get() 将立即抛出异常。

在 Java 8 之前,您可以使用 Google 的 guava 库,它提供了一个非常相似的类com.google.common.base.Optional