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

新手上路,请多包涵

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 = 某个值;

而且我想我在这里只是在谈论语法,在编译代码之后,从性能角度来看,代码的编写方式可能没有太大区别。

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

其他语言有这个功能吗?

原文由 Continuity8 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 722
2 个回答

Java 缺少 coalesce 运算符,因此具有显式临时代码的代码是单次调用分配的最佳选择。

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

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

然而,这很难阅读。

原文由 Sergey Kalinichenko 发布,翻译遵循 CC BY-SA 3.0 许可协议

与 Loki 的回答原则相同,但更短。请记住,更短并不意味着更好。

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


注意:JDK 的架构师和可选功能的设计者明确反对使用 Optional 。您每次都分配一个新对象并立即将其丢弃。但另一方面,它的可读性很高。

原文由 jhyot 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题