如何在Java中检查一个整数是否为空或为零?

44

有更简洁的写法吗:

if (myInteger != null && myInteger != 0) { ... }
例如,对于字符串,您可以使用StringUtils.isBlank()

1
@RafałLaskowski 这取决于类型,即 intInteger(后者可以为空)。 - Thomas
2
@RafałLaskowski 他/她的意思是 Integer 而不是 int - Sweeper
4
考虑到问题标题和变量名称,很明显这是一个“整数(Integer)”。 - Jon Skeet
2
让Apache论坛记下来升级吧!! :) - Valath
7
据我所知,不是这样的。虽然你可以轻松地定义一个静态实用方法来做到这一点,但我不会这样做,因为那样会赋予值0一个可疑的特殊含义(尽管在C/C++中存在)。看起来你正在使用myInteger作为可选值。如果是这种情况,并且你在Java 8中,则可以使用Optional<Integer>并编写 if (myOptInteger.orElse(0) != 0) - Giulio Franco
显示剩余8条评论
9个回答

36

使用Java 8:

if (Optional.ofNullable(myInteger).orElse(0) != 0) {
  ...
}

请注意,Optional 可能会帮助您完全避免 if 条件语句,具体取决于您的使用情况...


1
是的,同意这比“丑陋平凡”的解决方案更长。但这就是我添加 Optional 可能有助于避免所有这些检查的原因... - Florian Albrecht
1
尽管这个解决方案并不比 OP 中的解决方案更加“简洁”,但使用 Optional 确实打开了我不知道存在的门——特别是如果对象不仅仅是一个原始包装器。 - Matt
2
这个条件可以少一点intValue() :) if (Optional.ofNullable(myInteger).orElse(0) != 0) { .... - Vladimir Gilevich
@VladimirGilevich 感谢您的提示!我不是自动装箱的大粉丝,因为您永远不知道编译器会将其转换成什么,但是在这种情况下,它甚至可以提高可读性。 - Florian Albrecht
@FlorianAlbrecht 或者稍微改变一下:if (!Optional.ofNullable(myInteger).orElse(0).equals(0)) { .... - Vladimir Gilevich
显示剩余2条评论

13

由于在问题中提到了StringUtils类,我假设项目已经在使用Apache Commons库。

那么你可以使用以下方法:

if (0 != ObjectUtils.defaultIfNull(myInteger, 0)) { ... }

或者使用静态导入:

if (0 != defaultIfNull(myInteger, 0)) { ... }

6
我会使用三元条件语句来实现这个功能。代码如下:
public static boolean isNullorZero(Integer i){
    return 0 == ( i == null ? 0 : i);
}

我同意这段文字不易读懂 ;)


1
i == null || i == 0 这不是很容易吗 :P - TheCurious

2

还有一种空安全的方法可以这样做:

Long val = null;
if( val == Long.valueOf( 0 ) ) {...}

或者

if( Objects.equals( val, 0L ) ) {...}

4
请注意,使用 valueOf(0) 的第一个代码示例仅适用于-127至128之间的值。考虑使用此技术的人不应该假设它在一般情况下都有效。 - Parakleta
@Parakleta 实际上,它适用于更大的整数 System.out.println(999999999l == Long.valueOf( 999999999 )); 我记得学习过范围在[-128:127]之间的长池,但似乎这不是Java 11的情况。 - ITisha
3
你所写的不同于第一个代码示例。请再试一次,使用 Long val = 999999999l; System.out.println(val == Long.valueOf(999999999));。这里的区别在于你在注释中给出的示例实际上是将 Long 拆箱为原始的 long 进行比较。 - Parakleta
@Parakleta 是的,你说得对,我漏掉了。非常感谢! - ITisha

2
private boolean isNullOrZero(Integer i){
     return i == null || i.intValue() == 0;
}

对于其他类型:

i.longValue() == 0 对于Long类型

i.doubleValue() == 0 对于Double类型

i.shortValue() == 0 对于Short类型

i.floatValue() == 0 对于Float类型


1
我创建了一个帮助方法,可能会对你有所帮助,它使用了反射技术,因此你需要考虑是否有必要使用它,同时你需要安装Java 8。
该方法适用于所有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);
        }
    }
}

您可以这样调用:

Integer myNumber = NumberUtils.getNumberOrZero(someIntegerThatCanBeNull, Integer.class);

我希望这可以帮助你。

0
根据您对myInteger的实现(即如果myInteger中的整数属性是框类型Integer还是未装箱的原始int),您可能只需要编写一个条件语句。

Integer是实际对象,这意味着它们有能力为null。 话虽如此,它们也可以将0作为值保存。 因此,在这种情况下,您必须进行两个检查。

int是原始类型,不能保存null值。 在这种情况下,您只需检查您的int属性是否不等于0。


0

ObjectUtils.nullSafeEquals(0, myInteger) 是一个很好的选择,如果你不想增加圈复杂度,同时仍然希望在处理空值时获得 myInteger.equals(0) 的功能。


0
private boolean isNotNullAndZero(Long num){
        return Optional.ofNullable(num).orElse(0L) != 0L ? true:false;
    }

如果问题是关于整数,为什么要使用“Long”?当然,问题没有明确指定它是指一般意义上的整数还是特定宽度意义上的整数,但无论哪种情况,为什么要使用“Long”呢? - starball
编写 ? true : false 几乎总是完全多余的。永远不要这样做。之后,你的答案几乎与我的完全相同。 - Florian Albrecht

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接