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吗
如果查看ofIsNull
方法
/* 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)
overobject==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正如我在评论中提到的,键入错误的风险仅限于nullableBoolean
wrappe