用java 8替换null check可选

spr*_*ast 5 java lambda optional java-8 java-stream

我试图用可选的替换下面的代码块,只是想检查这样做会有什么不好的影响,如性能或其他任何东西?

现有代码:

UserObj userObj=new UserObj();
Object result = fetchDetails();
if (null != result) {
    userObj.setResult(result.toString());
}
Run Code Online (Sandbox Code Playgroud)

使用Java 8 Optional:

UserObj userObj=new UserObj();
Optional.ofNullable(fetchDetails()).ifPresent(var -> userObj.setResult(var.toString()));
Run Code Online (Sandbox Code Playgroud)

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

ETO*_*ETO 6

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

if(obj != null){ ... }
Run Code Online (Sandbox Code Playgroud)

重点Optional是为函数提供一种返回值的方法,以指示缺少返回值.请阅读这篇文章了解更多详情.

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

Optional<ResultObj> fetchDetails() {
   ...
}
Run Code Online (Sandbox Code Playgroud)

然后,您只需Optional像以前一样链接获取的方法.

更新

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

Optional<ResultObj> fetchOptionalDetails() {
    return Optional.ofNullable(fetchDefails());
}
Run Code Online (Sandbox Code Playgroud)

创建一个新方法会增加很小的开销,但代码将更具可读性:

fetchOptionalDetails().ifPresent(details -> /* do something */);
Run Code Online (Sandbox Code Playgroud)

  • 这是正确的答案.替换大量代码,只是替换if语句没有帮助.可选项表示潜在的无效返回值. (5认同)