之前可能会问,但找不到它。
我在表格中写了很多陈述:
if (bar.getFoo() != null) {
this.foo = bar.getFoo();
}
我想到了三元运算符,但在我看来,这并没有让它变得更好:
this.foo = bar.getFoo() != null ? bar.getFoo() : this.foo;
我的主要问题是我必须在两种情况下两次编写bar.getFoo()。当然我可以写一个解决这个问题的辅助方法,但我想知道是否有更优雅的解决方案。
与Avoiding != null statements不同,因为该问题不涉及将值检查为null的值。
答案 0 :(得分:4)
这避免了if语句并且只调用getFoo()
一次。但您必须输入this.foo
两次:
this.foo = Objects.requireNonNullElse(bar.getFoo(), this.foo);
答案 1 :(得分:2)
使用辅助方法并不是一个坏主意。例如Map
接口与geetOrDefault
方法的关系 - 在您的情况下看起来像:
//in Bar
public Foo getFooOrDefault(Foo defaultValue) {
return foo == null ? defaultValue : foo;
}
或者,您可以强制执行foo != null
,如果它与您的用例兼容并完全取消空检查。
最后,您还可以返回Optional<Foo>
:
//in Bar
public Optional<Foo> getFoo() {
return Optional.ofNullable(foo);
}
//in your code:
bar.getFoo().ifPresent(f -> this.foo = f);
答案 2 :(得分:2)
如可选javadoc中所述:
A container object which may or may not contain a non-null value.
说过这是最多的&#34; java-8&#34;处理空检查的方法。这是Java Optional介绍的最初意图之一。让getFoo返回一个Optional你可以使用Optional上的ifPresent函数,你很高兴。
答案 3 :(得分:1)
我做了
Foo tmpFoo = bar.getFoo();
if (tmpFoo != null)
this.foo = tmpFoo;
这消除了多余的函数调用。
答案 4 :(得分:0)
其他答案已经指出了正确的解决方案(来自java-8
+),即Optional<T>
类。
我只是想补充一点,2009年有一个proposal,现在回忆起Kotlin
的{{3}}(包括我在内的很多Java
程序员,非常渴望)
从提案链接引用:
如果组是非空的,我们可以计算成员的名称 非空,第一个成员具有已知(非空)名称,否则 字符串“nobody”:
final String aMember = g?.members?[0]?.name ?: "nobody";
如果没有此功能,开发人员目前会写:
String aMember = null; if (g != null && g.members != null && g.members[0].name != null) { aMember = g.members[0].name; } else { aMember = "nobody"; }
建议的版本更短,更清晰,甚至可以 被赋予最终变量。
不知道发生了什么事,但它会为我们节省很多代码。