做零检查的方法较短

时间:2018-01-12 11:38:26

标签: java

之前可能会问,但找不到它。

我在表格中写了很多陈述:

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

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

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

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

Avoiding != null statements不同,因为该问题不涉及将值检查为null的值。

5 个答案:

答案 0 :(得分:4)

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

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

requireNonNullElse​ docs

答案 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";
}
     

建议的版本更短,更清晰,甚至可以   被赋予最终变量。

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