IsNull vs object = = null

如你所知,java.util.Objects

此类由用于对对象进行操作的静态实用工具方法组成。

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

我的理解是,通过省略第二个 =Objects.isNull()将消除意外地将空值赋给对象的可能性。

然而,API Note 指出:

此方法用作谓词筛选器(Objects: : isNull)

是否有任何原因/情况下,我应该使用 object == null超过 Objects.isNull()在一个 如果声明

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

165114 次浏览

在 if 语句中应该使用 object = = null 覆盖 Objects.isNull ()吗?

如果您查看 IsNull方法的 源代码,

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


public static boolean isNull(Object obj) {
return obj == 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而设计的,但这并不妨碍你像上面那样使用它。

有没有什么理由/情况需要我在 如果声明中使用 object = = null/Objects.isNull () ?

是的,一个原因是保持代码简单。在 如果声明object == null是清楚和众所周知的。它不能导致任何不当行为,例如,如果有一个打字错误。

我的理解是 Objects.isNull ()将通过省略第二个 = 来消除意外地将 null 值赋给 object 的可能性。

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

if (object == null) {
}


if (Objects.isNull(object)) {
}

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

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

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

@ apiNoteThis 方法可以用作 java.util.function. Preate,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();

Objects.isNull打算在 Java8 lambda 过滤中使用。

这样写起来更容易也更清晰:

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

而不是写:

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

但是,在 if语句中,这两种方法都可以工作。使用 == null可能更容易阅读,但最终它将归结为一种风格偏好。

在语义上没有区别,但为了可读性,我更喜欢以下内容而不是 whatever == null:

import static java.util.Objects.isNull;


// Other stuff...


if(isNull(whatever)) {


}