更短的方式来做空检查

大概问过之前,却找不到它。

我正在写很多陈述:

if (bar.getFoo() != null) { this.foo = bar.getFoo(); } 

我想到了三元运算符,但是在我看来,这并没有让我更好:

 this.foo = bar.getFoo() != null ? bar.getFoo() : this.foo; 

我的主要问题是我必须在两种情况下写两次bar.getFoo()。 当然,我可以写一个解决这个问题的帮手方法,但我想知道是否有更优雅的解决方案。

与以下不同: 避免!= null语句,因为该问题不处理为空值检查的值分配值。

正如在可选的javadoc中写的:

A container object which may or may not contain a non-null value.

话虽如此,这是处理空检查最“java-8”的方式。 这是Java可选介绍的初衷之一。 让getFoo返回一个Optional,你可以在Optional上使用ifPresent函数。

这避免了if语句并调用getFoo()一次。 但是你必须输入this.foo两次:

 this.foo = Objects.requireNonNullElse​(bar.getFoo(), this.foo); 

requireNonNullElse文档

使用辅助方法不是一个坏主意。 例如,这就是Map接口对其geetOrDefault方法的作用 – 在你的情况下,它看起来像:

 //in Bar public Foo getFooOrDefault(Foo defaultValue) { return foo == null ? defaultValue : foo; } 

或者,如果与您的用例兼容,则可以强制执行foo != null ,并完全除去空的检查。

最后你也可以返回一个Optional

 //in Bar public Optional getFoo() { return Optional.ofNullable(foo); } //in your code: bar.getFoo().ifPresent(f -> this.foo = f); 

我会做一个

 Foo tmpFoo = bar.getFoo(); if (tmpFoo != null) this.foo = tmpFoo; 

这消除了多余的函数调用。

其他答案已经指出了正确的解决方案(从java-8 +),这是Optional类。


我只想补充说,2009年有一个提案 ,这个提案回顾了当今Kotlin的安全调用 (包括我在内的许多Java程序员非常渴望的)

从提案链接引用:

我们可以计算一个成员的名字,如果该组非空和非空,第一个成员有一个已知的(非空)名称,否则字符串“nobody”:

 final String aMember = g?.members?[0]?.name ?: "nobody"; 

没有这个function,开发者现在会写:

 String aMember = null; if (g != null && g.members != null && g.members[0].name != null) { aMember = g.members[0].name; } else { aMember = "nobody"; } 

建议的版本更短,更清晰,甚至可以指定为最终variables。

不知道发生了什么事情,但它会为我们节省许多代码。