检查返回值是否不为空,如果是,则在一行中分配它,使用一个方法调用

Java充斥着这样的语句:

if(cage.getChicken() != null) {
    dinner = cage.getChicken();
} else {
    dinner = getFreeRangeChicken();
}

这需要两次调用,然后才能将返回的对象分配给 。getChicken()dinner

这也可以写在一行中,如下所示:

dinner = cage.getChicken() != null? cage.getChicken() : getFreeRangeChicken();

但是,唉,仍然有两个调用.getChicken()

当然,我们可以分配一个局部变量,然后再次使用三元运算符来分配它,如果它不是空的,但这是两行,不是那么漂亮:

FutureMeal chicken = cage.getChicken();
dinner = chicken != null? chicken : getFreeRangeChicken();

那么有没有办法说:

变量 var = 某个值,如果某个值不为空或某个其他值;

我想我在这里只是在谈论语法,在编译代码之后,在性能意义上编写代码的方式可能没有太大区别。

由于这是如此常见的代码,因此最好有一个单行代码来编写它。

是否有任何其他语言具有此功能?


答案 1

原理与洛基的答案相同,但更短。请记住,更短并不自动意味着更好。

dinner = Optional.ofNullable(cage.getChicken())
  .orElse(getFreerangeChicken());

注意:JDK 的架构师和 Optional 功能的设计者明确不鼓励使用 。您正在分配一个新对象,并且每次都立即将其丢弃。但另一方面,它可以非常可读。Optional


答案 2

Java 缺少合并运算符,因此具有显式临时的代码是具有单个调用的赋值的最佳选择。

您可以使用结果变量作为临时变量,如下所示:

dinner = ((dinner = cage.getChicken()) != null) ? dinner : getFreeRangeChicken();

然而,这很难读懂。