java.util.Objects.isNull vs object == null

时间:2016-06-22 15:49:10

标签: java java-8 compare

如您所知,java.util.Objects

  

此类包含用于操作对象的静态实用程序方法。

其中一种方法是Objects.isNull()

我的理解是Objects.isNull()将通过省略第二个=来消除意外为对象分配空值的机会。

然而,API Note指出:

  

此方法可用作谓词,过滤器(Objects :: isNull)

我是否应该在 if语句中使用object == null而不是Objects.isNull()

Objects.isNull()应该仅限于谓词吗?

5 个答案:

答案 0 :(得分:50)

  

应该在if语句中使用object == null而不是Objects.isNull()吗?

如果您查看IsNull方法的source code

 /* Returns true if the provided reference is null otherwise returns false.*/

 public static boolean isNull(Object obj) {
     return obj == null;
 }

它是一样的。没有区别。所以你可以安全地使用它。

答案 1 :(得分:30)

Objects.isNull旨在用于Java 8 lambda过滤。

编写

更容易,更清晰
.stream().filter(Objects::isNull) 

而不是写

.stream().filter(x -> x == null).  

在一个if中,无论哪个都可以工作,使用== null可能更容易阅读,但最终它将归结为样式首选项。

答案 2 :(得分:10)

看看来源:

public static boolean isNull(Object obj) {
    return obj == null;
}

要检查null值,您可以使用:

  • Objects.isNull(myObject)
  • null == myObject // avoids assigning by typo
  • myObject == null // risk of typo

Objects.isNull适用于Predicate的事实并不妨碍您如上所述使用它。

答案 3 :(得分:3)

  

我是否应该在 if语句中对Objects.isNull()使用object == null?

是的,一个原因是保持代码简单。在 if语句 object == null内是明确且众所周知的。如果例如存在拼写错误,则不会导致任何不当行为。

  

我的理解是Objects.isNull()会通过省略第二个=来消除意外为对象分配空值的机会。

如果if (object = null) {} 省略 =它将无法编译,或者在Boolean对象的情况下会生成警告!实际上,没有理由在 if语句中使用Objects.isNull(object)而不是object == null。以下是两个并排的变体:

if (object == null) {
}

if (Objects.isNull(object)) {
}
  

Objects.isNull()应该仅限于Predicates吗?

可以说是的,它仅限于Predicates,尽管在任何地方都没有使用Objects.isNull()的技术障碍。

来自public static boolean isNull(Object obj)方法' javadoc:

  

@apiNoteThis方法存在用作java.util.function.Predicate,filter(Objects :: isNull)

因此,如果您将该方法用作而不是谓词,那么与简单object == null相比,您实际上使用的是更复杂和繁琐的表达式。

以下是一个用于比较Objects.isNull(object)

的好处的代码段
List<String> list = Arrays.asList("a", "b", null, "c", null);

// As ready-made predicate
long countNullsWithPredicate = list.stream().filter(Objects::isNull).count();

// Lambda
long countNullsWithLambda = list.stream().filter(object -> object == null).count();

// Reimplement the Objects::isNull predicate
long countNullsWithAnonymous = list.stream().filter(new Predicate<Object>() {
    @Override
    public boolean test(Object obj) {
        return obj == null;
    }
}).count();

答案 4 :(得分:1)

在语义上没有什么区别,但是出于可读性考虑,我更喜欢以下内容而不是whatever == null

import static java.util.Objects.isNull;

// Other stuff...

if(isNull(whatever)) { 

}