更短的方式来做空检查
大概问过之前,却找不到它。
我正在写很多陈述:
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。
不知道发生了什么事情,但它会为我们节省许多代码。