在int中将int与可能为空的Integer进行比较的最简洁方法是什么?

时间:2014-10-08 13:57:40

标签: java casting nullpointerexception

Map<String,Integer> m;
m = new TreeMap<String,Integer>();

当m.get()为null时,添加以下强制转换以避免空指针异常是一种好习惯。

System.out.println( ((Integer) 8).equals( m.get("null") ) ); // returns false

或者使用先前的空检查,它开始看起来有点难看。

System.out.println( m.contains("null") != null && m.get("null").equals( 8 ) );

有没有更好的方法来写这个?感谢。

5 个答案:

答案 0 :(得分:4)

==运算符不会比较值,而是引用。

您应该使用.equals()方法,而不是应用于Integer变量(您确定不是null并且NPE不会被抛出):

Integer eight = 8; //autoboxed
System.out.println(eight.equals(m.get("null")));

即使false返回m.get("null"),也会打印null

答案 1 :(得分:2)

我尽量避免使用强制转换,所以我宁愿使用以下内容,在我看来也更好看:

Integer.valueOf(8).equals(m.get("null"))

答案 2 :(得分:2)

不,因为它不起作用。您无法将两个Integer==进行比较,因为它会比较引用而不是整数值。查看this question

中的更多信息

您需要一个辅助方法,例如:

boolean safeIntegerCompare(Integer a, int b)
{
    if (a != null) 
      return a.intValue() == b;
    return false;
}

答案 3 :(得分:1)

如果只有一个参数可能是null(就像您将未知值与常量进行比较时那样),请使用equals(),如下所示:

Integer foo = Integer.valueOf(8); // you could write Integer foo = 8; here too but I prefer to avoid autoboxing
if (foo.equals(m.get("x"))) { //will never throw an NPE because foo is never null
   ...
}

请注意,您的示例通常无法正常工作,因为将非原始值与==进行比较仅在引用同一对象实例时才返回true。 (在这种情况下,甚至可能出于非常具体的原因,但大部分时间都不是。)

答案 4 :(得分:0)

为了扩展接受的答案:我发现自己必须检查 2 个整数变量的相等性,这些变量可能为空,也可能不为空。

所以我的解决方案是:

<块引用>

布尔等于 = Optional.ofNullable(objectA.getNullableInteger()).equals(Optional.ofNullable(objectB.getNullableInteger());