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

Luc*_*s T 58 java compare java-8

如你所知,java.util.Objects

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

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

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

但是,API Note指出:

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

会不会有任何理由/环境对我应该使用object == nullObjects.isNull()if语句

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

Sur*_*tta 59

应该在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;
 }
Run Code Online (Sandbox Code Playgroud)

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

  • 是的,它可以使用,但它可能会干扰工具执行的本地流量分析.即,使用简单的"==",任何流分析都可以看到在当时分支中取消引用不好,但在其他分支中是安全的.你会得到适当的错误/警告或什么都没有.通过调用isNull()的间接性,知识可能会丢失到工具中. (7认同)
  • 在 `if` 中使用 `== null` 更符合语义,但 isNull 非常适合用于 lambda 表达式。 (5认同)
  • 有轻微的性能差异。Java 检查对象空引用与调用静态方法会有所不同。而且它读起来比我们都习惯的使用 == 更清晰。 (4认同)
  • 它当然是合法的,但相对于运营商来说没有任何好处。因此,如果您在团队中工作,请根据其预期目的使用物品。 (4认同)

小智 44

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

写作更简单,更清晰

.stream().filter(Objects::isNull) 
Run Code Online (Sandbox Code Playgroud)

而不是写

.stream().filter(x -> x == null).  
Run Code Online (Sandbox Code Playgroud)

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

  • 我不同意“写起来更容易/更清晰”的说法。1. 不是更简洁。2. 显然表达能力较差,特别是对于那些不熟悉最新Java语法的人来说。对于我来说,作为一个不每天编写 Java 的人(我编写 Scala),拥有一个除了检查 null 之外什么都不做的静态方法感觉很幻觉。这种方法只是阻碍了流畅的代码阅读,没有任何好处。 (12认同)

Men*_*ena 10

看看来源:

public static boolean isNull(Object obj) {
    return obj == null;
}
Run Code Online (Sandbox Code Playgroud)

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

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

这一事实Objects.isNull是为Predicates不阻止你使用它上面的.

  • 如果(myObject = null)将导致编译错误,则输入错误的风险是C++中的问题,而不是Java中的问题.您应该始终使用myObject == null over null == myObject. (3认同)
  • @AshishLohia使用`=`而不是`==`(不会编译,除非它是一个可以为空的`Boolean`包装器,你是公平的) (2认同)

Vas*_*sil 7

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

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

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

如果省略if (object = null) {}with ,则不会编译,或者在object 的情况下会生成警告!实际上没有理由在if 语句中使用over 。这是并排的两个变体: =BooleanObjects.isNull(object)object == null

if (object == null) {
}

if (Objects.isNull(object)) {
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

@apiNote此方法存在用作 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();
Run Code Online (Sandbox Code Playgroud)


小智 6

从语义上讲,没有区别,但为了可读性,我更喜欢以下内容whatever == null

import static java.util.Objects.isNull;

// Other stuff...

if(isNull(whatever)) { 

}
Run Code Online (Sandbox Code Playgroud)