【问题标题】:Replacing null check with java 8 optional用 java 8 替换空检查可选
【发布时间】:2019-01-29 08:22:35
【问题描述】:

我正在尝试用可选的代码块替换下面的代码块,只是想检查这样做会不会产生任何不良影响,比如性能或类似的东西?

现有代码:

UserObj userObj=new UserObj();
Object result = fetchDetails();
if (null != result) {
    userObj.setResult(result.toString());
}

使用 Java 8 Optional:

UserObj userObj=new UserObj();
Optional.ofNullable(fetchDetails()).ifPresent(var -> userObj.setResult(var.toString()));

进行此更改只是为了使代码看起来简洁,因为我的代码中有很多空检查块。

【问题讨论】:

  • 正确的方法是如果fetchDetails 已经返回Optional。此类旨在由希望指示无结果的方法返回。否则额外的安全机制不会捕获(为了防止人们忘记空检查,如果他们只得到一个Optional,他们就不会忘记。因为他们无法在不触发检查的情况下访问内容)。跨度>
  • 我认为这个问题应该在Code Review社区提出。
  • 您的旧代码看起来很可疑:userObj.setResult(userObj.toString())。显然,你实际上想要userObj.setResult(result.toString())
  • 使用Optional 有一点点开销,您和您的用户可能永远不会注意到。您使用 Optional 的代码看起来不错。我同意那些说如果fetchDetails 从一开始就返回Optional 会更好。

标签: java lambda java-8 java-stream optional


【解决方案1】:

首先,我认为您误解了Optional 的目的。它不仅仅是为了替换

if(obj != null){ ... }

Optional 的要点是为函数返回值提供一种方法,以指示没有返回值。请阅读this post了解更多详情。

在您的情况下正确使用Optional 是从fetchDetails 方法返回可选的ResultObj

Optional<ResultObj> fetchDetails() {
   ...
}

然后,您只需像以前一样将获取的Optional 上的方法链接起来。

更新

如果您无法修改 fetchDetails,仍然可以选择将其包装到您自己的方法中,如下所示:

Optional<ResultObj> fetchOptionalDetails() {
    return Optional.ofNullable(fetchDefails());
}

创建一个新方法会增加一点开销,但代码会更易读:

fetchOptionalDetails().ifPresent(details -> /* do something */);

【讨论】:

  • 这是正确答案。替换很多代码,只是为了替换 if 语句是没有帮助的。可选项用于表示可能为空的返回值。
  • 我知道 Optional 被设计为主要用作方法返回类型,但在我的情况下 fetchDetails 方法是由我无法控制的 3rd 方 jar 提供的,所以想检查是否编写上面的编码方式是正确的,而不是 if 和 null 检查
  • @springmotive 在这种情况下,您的代码很好。虽然我会稍微改变它。请检查我的更新。
【解决方案2】:

fetchDetails() 返回Optional 在这里更有意义。那么你可以直接查看ifPresent然后继续

【讨论】:

    猜你喜欢
    • 2022-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-05
    • 2021-05-15
    • 2017-03-21
    • 1970-01-01
    • 2015-07-10
    相关资源
    最近更新 更多