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

时间:2017-03-23 17:40:42

标签: java

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

Long foo=null;
bar.methodExpects_long_primitive(foo);

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

Long foo=null;
if(foo!=null){
bar.methodExpects_long_primitive(foo);
}

或者如果我想提供默认值

Long foo=null;
bar.methodExpects_long_primitive(foo==null?defaultValue:foo);

有优雅/更好的方法吗?我必须在代码库中重复多次这样做,这样做似乎增加了许多条件。

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

3 个答案:

答案 0 :(得分:3)

Long没有内置任何内容(例如,某些静态方法)。

假设您有多个方法接受long,您需要使用它,您可能需要自己的方法,类似于

// On some utility class, say LongUtil
public static long val(Long l, long defaultvalue) {
    return l == null ? defaultValue : l.longValue();
}

然后

bar.methodExpects_long_primitive(LongUtil.val(foo, defaultValue));

当然,这并不比

短很多
bar.methodExpects_long_primitive(foo == null ? defaultValue : (long)foo);

如果只是methodExpects_long_primitive,我可能会修改它以接受Long,并处理其中的null

答案 1 :(得分:2)

从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 );

或者您可以测试Optional是否包含Optional.empty()的值:

    Long foo = null;

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

        System.out.println( longFoo );
    }

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

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

答案 2 :(得分:1)

只需更改方法以获取对象Long,然后检查null

T methodExpects_long_primitive(Long l) {
    long foo = (l != null) ? l : 0L;

如果您不欠该方法,则需要在编写

时处理该方法的null
bar.methodExpects_long_primitive(foo==null?defaultValue:foo);