如何在Java中检查整数是null还是零?
有没有更简洁的写作方式:如何在Java中检查整数是null还是零?,java,Java,有没有更简洁的写作方式: if (myInteger != null && myInteger != 0) { ... } 例如,对于字符串,您可以使用StringUtils.isBlank(),具体取决于myInteger的实现(即,如果myInteger中的Integer属性是框类型Integer或未装箱的原语int),您可能只需要编写一个条件 Integers是实际对象,这意味着它们可以null。也就是说,它们也可以将0作为一个值。因此,在这种情况下,您必须进行两项检查
if (myInteger != null && myInteger != 0) { ... }
例如,对于字符串,您可以使用
StringUtils.isBlank()
,具体取决于myInteger
的实现(即,如果myInteger
中的Integer属性是框类型Integer
或未装箱的原语int
),您可能只需要编写一个条件
Integer
s是实际对象,这意味着它们可以null
。也就是说,它们也可以将0作为一个值。因此,在这种情况下,您必须进行两项检查
int
是原语,不能保存null
的值。在这种情况下,您只需检查您的int
属性是否不等于0。对此,我将使用三元条件。比如:
public static boolean isNullorZero(Integer i){
return 0 == ( i == null ? 0 : i);
}
这是不可读的,我同意;) 使用Java 8:
if (Optional.ofNullable(myInteger).orElse(0) != 0) {
...
}
请注意,
Optional
可能会帮助您完全避免if条件,具体取决于您的用例…由于问题中提到了StringUtils
类,我假设项目中已经使用了Apache Commons库
然后,您可以使用以下选项:
if (0 != ObjectUtils.defaultIfNull(myInteger, 0)) { ... }
或使用静态导入:
if (0 != defaultIfNull(myInteger, 0)) { ... }
我创建了一个helper方法,可能可以帮助您,它使用反射,所以您必须考虑是否有必要使用它,您还需要Java8 该方法适用于所有java编号:
public class NumberUtils {
private NumberUtils(){
}
public static < T extends Number> T getNumberOrZero(T number, Class<? extends Number> clazz) {
return Optional.ofNullable(number)
.orElse(getZeroValue(clazz));
}
@SuppressWarnings("unchecked")
private static < T extends Number> T getZeroValue( Class<? extends Number> clazz){
try{
Constructor<? extends Number> constructor = clazz.getDeclaredConstructor(String.class);
return (T) constructor.newInstance("0");
}catch (ReflectiveOperationException e) {
throw new IllegalArgumentException("Can't get zero value ", e);
}
}
}
我希望这能帮助你
private boolean isNullOrZero(Integer i){
return i == null || i.intValue() == 0;
}
对于某些其他类型:
i.longValue()==0
i.doubleValue()==0
表示双精度
i.shortValue()==0
i.floatValue()==0
对于Float有两种空安全的方法,如下所示:
Long val = null;
if( val == Long.valueOf( 0 ) ) {...}
或
@RafałLaskowski,这取决于类型,即int
与Integer
(后者可以为空)。@RafałLaskowski的意思是Integer
而不是int
@skw:给定问题的标题和变量的名称,很明显,它是Integer
。让apache论坛记下这一点来升级!!:)据我所知不是这样。虽然可以很容易地定义静态实用程序方法来实现这一点,但我不会这么做,因为这会给值0一个特殊的含义,这是值得怀疑的(即使它存在于C/C++中)。似乎您正在使用myInteger作为可选值。如果是这种情况,并且您使用的是Java8,那么您可以使用可选的并编写If(myOptInteger.orElse(0)!=0)
Yep,同意这比“丑陋的普通”解决方案要长。但这就是为什么我添加了可选选项,这可能有助于根本避免这些检查…这仍然无法检查myInteger是否为null&这将导致NullPointerException失败。由于目标对象是整数,我们必须同时检查NOTNULL和NOTZERO。尽管此解决方案实际上并不比OP中的解决方案更“简洁”,使用Optional
确实打开了我不知道存在的门-尤其是当对象不仅仅是一个基本包装器时。如果没有intValue():)if(Optional.ofNullable(myInteger)。orElse(0)!=0),这种情况可能会少一点{..
@VladimirGilevich谢谢你的提示!我不太喜欢自动装箱,因为你永远不知道编译器从中得到了什么,但是是的,在这种情况下,它甚至增加了可读性。I==null | | I==0这不容易吗:P
Long val = null;
if( val == Long.valueOf( 0 ) ) {...}
if( Objects.equals( val, 0L ) ) {...}