检查 Integer Wrapper 是否为 NULL 以及原始值 0

Checking Integer Wrapper against NULL as well as primitive value 0

我在发布这个问题之前参考了这个。
Checking Null Wrappers against primitive values

而且我有情况想用 null 检查 Wrapper Integer 以及 0

if( statusId != null || statusId != 0 ) //statusId is Integer it maybe 0 or null
    // Do Somethimg here

我该如何克服这种情况?

or替换为and

if( statusId != null && statusId != 0 ) 

它会起作用,因为只有 statusId 不是 null :

statusId != null

您将尝试将 statusId 拆箱为 int:

statusId != 0 

并且在 statusIdnull 的情况下,短路 && 运算符将阻止抛出 NullPointerException,因为 statusId != 0 不会待评价。

如果你想摆脱null检查那么你可以使用equals,例如:

Integer i = null;
if(Integer.valueOf(0).equals(i)){
    System.out.println("zero");
}else{
    System.out.println("not zero");
}

问题是您让 null 通过了第二次检查,并得到了一个空指针。

等效的工作逻辑:

if (!(statusId == null || statusId == 0)) {
}

这个线程中已经有很多好的 'classic' Java 答案,所以为了它...这里有一个 Java 8 一个:使用 OptionalInt.

假设 statusId 是一个 OptionalInt,你会写:

if(statusId.isPresent() && statusId.getAsInt() != 0)

或者更隐秘一点,你可以这样做:

if(statusId.orElse(0) != 0)

在这种情况下,statusId 永远不会设置为空;相反,它被设置为 OptionalInt.of(<some int>)OptionalInt.ofNullable(<some Integer>)OptionalInt.empty()

这个答案的重点是,从 Java 8 开始,标准库提供了方便的 Optional and related classes for primitives to write null-safe Java code. You might want to check them out. Optional is especially handy, because of its filter and map 方法。

刚刚意识到为什么这个问题如此痛苦。 实际上 打字错误(如果是这样,@davidxxx 的回答是正确的)。这与逻辑等价无关。

但是,物有所值。问题具体要求:

if( statusId != null || statusId != 0 )

即"If it isn't null" 它进来了。或者 "if it isn't zero",它进来了。

所以,实际上,解决方案是:

if (true)

我不知道您的确切上下文,但您可以考虑使用 Apache Commons Lang 中的空安全方法,例如

if (ObjectUtils.defaultIfNull(statusId, 0) != 0)
  // Do Somethimg here