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

java.util.Objects.isNull vs object==null,java,java-8,compare,Java,Java 8,Compare,如你所知,这是 此类由用于操作对象的静态实用程序方法组成 其中一种方法是Objects.isNull() 我的理解是,Objects.isNull()将通过省略第二个=来消除意外为对象赋值的机会 然而,API注释指出: 此方法可用作谓词、筛选器(Objects::isNull) 在if语句中使用object==null而不是Objects.isNull()是否有任何原因/情况 Objects.isNull()是否应仅限于谓词 在if语句中,应该对Objects.isNull()使用object=

如你所知,这是

此类由用于操作对象的静态实用程序方法组成

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

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

然而,API注释指出:

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

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

Objects.isNull()
是否应仅限于谓词

在if语句中,应该对Objects.isNull()使用object==null吗

如果查看of
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//避免按输入错误赋值
  • myObject==null//打字风险
Objects.isNull
是用于
谓词
s的,这一事实并不妨碍您如上所述使用它

if语句中使用object==null覆盖Objects.isNull()是否有任何原因/情况

是的,一个原因是保持代码简单。在中,如果语句
对象==null
是明确的且众所周知的。例如,如果出现打字错误,则不会导致任何不当行为

我的理解是,Objects.isNull()将通过忽略第二个=,消除意外为object赋值的可能性

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

if (object == null) {
}

if (Objects.isNull(object)) {
}
Objects.isNull()是否应仅限于谓词

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

公共静态布尔值isNull(objectobj)
方法的javadoc:

@APINote此方法的存在是为了用作java.util.function.Predicate、过滤器(Objects::isNull)

因此,如果将该方法用作而不是谓词,那么与简单的
对象==null
相比,实际上使用的表达式更复杂、更麻烦

下面是比较
Objects.isNull(object)

List List=Arrays.asList(“a”、“b”、null、“c”、null);
//作为现成谓词
long countNullsWithPredicate=list.stream().filter(Objects::isNull.count();
//兰姆达
long countNullsWithLambda=list.stream().filter(object->object==null.count();
//重新实现Objects::isNull谓词
long countNullsWithAnonymous=list.stream().filter(新谓词(){
@凌驾
公共布尔测试(对象obj){
返回obj==null;
}
}).count();

对象。isNull
用于Java 8 lambda筛选

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

.stream().filter(Objects::isNull) 
.stream().filter(x -> x == null).  
而不是写:

.stream().filter(Objects::isNull) 
.stream().filter(x -> x == null).  

然而,在
if
语句中,两者都可以工作。使用
==null
可能更容易阅读,但最终会归结为一种风格偏好

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

import static java.util.Objects.isNull;

// Other stuff...

if(isNull(whatever)) { 

}

如果您所担心的只是意外赋值,那么您可以简单地一致地使用
If(null==variable)
。@Holder,有什么意外赋值需要担心?这是Java。你会得到一个类型错误。@LouisWasserman如果
变量
是一个
布尔值
@AlexisC,这在极少数情况下是一个问题:你的变量必须是一个非常特定的类型,你必须做出非常特定的键入,你不能使用任何IDE或编译器分析为你指出这一点(几乎所有IDE都会这样做)。我不担心这种情况。在工作中,我见过许多null==object的实例。当我询问时,我被告知这是为了防止意外的null赋值。根据这里提供的评论和答案,我倾向于认为这是一个口味问题。是的,它可以使用,但可能会干扰本地流由工具执行的分析。例如,使用一个简单的“==”,任何流分析都可以看到,取消引用在then分支中不好,但在else分支中是安全的。您将得到适当的错误/警告,或者什么都没有。通过间接调用isNull()该工具可能会丢失这些知识。性能略有不同。Java检查对象空引用与调用静态方法会有所不同。而且它的可读性比我们都习惯使用的==略差。在
if
中使用
==null
更具语义,但在lam上使用isNull非常好bda表达式。这当然是合法的,但对运营商没有任何好处。因此,如果您在团队中工作,请根据其预期目的使用东西。什么是拼写错误风险?@AshishLohia使用
=
而不是
=
(编译时除非是空代码<布尔> <代码>包装器,否则公平)键入的风险是C++中的问题,而不是java(MyObjult=空)将导致编译错误。您应该始终使用myObject==null而不是null==myObject。@TomasMarik正如我在评论中提到的,键入错误的风险仅限于nullable
Boolean
wrappe