【问题标题】:How do you simulate a null safe operator with a default return value?如何模拟具有默认返回值的空安全运算符?
【发布时间】:2015-10-28 23:16:47
【问题描述】:

我很抱歉标题,但我找不到用一句话描述问题的好方法。简而言之,我有很多遵循这种模式的 Java 代码

if (obj != null && obj.getPropertyX() != null) {
    return obj.getPropertyX();
}
return defaultProperty;

可以改写为

return obj != null && obj.getPropertyX() != null ? obj.getPropertyX() : defaultProperty;

它仍然很难看,我想知道 Google Guava 或其他库中是否有一些 API 可以帮助清理此代码。具体来说,我正在寻找类似的东西

return someAPI(obj, "getPropertyX", defaultProperty);

我可以使用反射来实现此方法,但我不确定这是否是正确的方法。谢谢。

【问题讨论】:

  • 其他语言有一个“安全导航运算符”,你可以说obj?.getPropertyX()而不是obj == null ? null : obj.getPropertyX()。例如,Groovy 和 C#。但是 Java 选择使用 Optional 类。 docs.groovy-lang.org/latest/html/documentation/…

标签: java guava


【解决方案1】:

在 Java 8 中,您可以使用:

return Optional.ofNullable(obj).map(Obj::getPropertyX).orElse(defaultProperty);

【讨论】:

  • 还有一件事使这个答案不到 100% 完美:如果 defaultProperty 是一个表达式而不是一个值,那么在问题中 defaultProperty 只会在必要时被评估,但在这个答案中它会无条件评估。
  • @KlitosKyriacou 你应该建议orElseGet
  • 谢谢。这可行,但并不像我预期的那样干净:( 无论如何,我不知道其他语言的安全导航运算符,看起来很优雅。
猜你喜欢
  • 2021-09-28
  • 2018-12-22
  • 1970-01-01
  • 2015-02-25
  • 2018-01-26
  • 1970-01-01
  • 2021-07-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多