2016-06-22 139 views
19

如你所知,java.util.Objectsjava.util.Objects.isNull VS对象== NULL

有关对象

这种方法之一是Objects.isNull工作的实用方法() 。

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

然而,API注状态:

这种方法存在着用作谓词,过滤器(对象::的isNull)

会不会有任何理由/环境为此,我应该在if语句上使用Objects == null对象Object.isNull()

Objects.isNull()仅限于Predicates?

由于提前, 卢卡斯

+0

there's Objects.requireNonNull(T obj); btw –

+1

如果你所担心的只是偶然的分配,你可以简单地使用'if(null == variable)'... – Holger

+1

@Holder,你有什么意外的担心吗?这是Java。你会得到一个类型错误。 –

回答

18

应在使用if语句对象== NULL超过Objects.isNull()?

如果你看一下IsNull方法source code

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

public static boolean isNull(Object obj) { 
    return obj == null; 
} 

这是一样的。没有区别。所以你可以安全地使用它。

+1

是的,可以使用,但可能会干扰工具执行的局部流量分析。即,用一个普通的“==”表示,任何流分析都可以看到,当时分支中的解引用不好,但在其他分支中是安全的。你会得到适当的错误/警告或什么都没有。随着调用isNull()的间接性,知识可能会丢失到工具中。 –

9

看看源:

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的事实并不妨碍您像上面那样使用它。

+1

你是什么意思的错字的风险? –

+1

@AshishLohia通过使用'='而不是'=='(不会编译,除非它是一个可为空的'布尔'包装,是公平的) – Mena

+0

感谢您的清除。 –

1

会不会有任何理由/情形为此我应该在if语句使用对象== NULL超过Objects.isNull()?

是的,一个原因是保持代码简单。在之内如果陈述object == null是清楚和众所周知的。如果存在拼写错误,它不会导致任何不当行为。

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

如果有if (object = null) {}省略=它不会编译或将在Boolean对象的情况下产生的警告!其实没有理由使用Objects.isNull(object)而不是object == null如果声明。这里有两个变种并排:

if (object == null) { 
} 

if (Objects.isNull(object)) { 
} 

是否应Objects.isNull()仅限于专门的谓词?

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

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

@apiNoteThis方法存在被用作java.util.function.Predicate,过滤器(对象::参考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(); 
4

Objects.isNull的好处是针对Java 8拉姆达过滤中使用。

它更容易和更清晰的写

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

比写

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

在if然而无论是将工作,使用== NULL的可能是更容易阅读,但在结束它将归结为一种风格偏好。