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

如您所知, java.util.Objects是

用于操作对象的实用程序方法

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

我的理解是Objects.isNull()将通过省略second =来消除意外地将null值赋值给对象的机会。

但是,API Note指出:

此方法存在用作谓词,filter(Objects :: isNull)

是否有任何理由/情况我应该在if语句中使用Object = is null而不是Objects.isNull()?

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

在此先感谢,卢卡斯

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

如果你看一下IsNull方法的源代码 ,

  /* Returns true if the provided reference is null otherwise returns false.*/ public static boolean isNull(Object obj) { return obj == null; } 

这是相同的。 没有区别。 所以你可以安全地使用它。

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

写作更简单,更清晰

 .stream().filter(Objects::isNull) 

而不是写

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

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

看看来源:

 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的事实并不妨碍您如上所述使用它。

是否有任何理由/情况我应该在if语句中使用Object = is null而不是Objects.isNull()?

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

我的理解是Objects.isNull()将通过省略second =来消除意外地将null值赋值给对象的机会。

如果if (object = null) {}带有省略 =它将无法编译,或者它将在Boolean对象的情况下生成警告! 实际上没有理由在if语句中使用Objects.isNull(object) over 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 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() { @Override public boolean test(Object obj) { return obj == null; } }).count();