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