我试图将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);
有优雅/更好的方法吗?我必须在代码库中重复多次这样做,这样做似乎增加了许多条件。
我可以创建自己的方法来执行此操作,但我想知道是否已有任何此类库方法。
答案 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;
如果您不欠该方法,则需要在编写
时处理该方法的nullbar.methodExpects_long_primitive(foo==null?defaultValue:foo);