用Java 8可选替换null检查

时间:2019-01-29 08:22:36

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

我正在尝试用可选的代码块替换下面的代码块,只是想检查这样做是否会对性能或诸如此类的事情产生不良影响?

现有代码:

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()));

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

2 个答案:

答案 0 :(得分:6)

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

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

Optional的重点是为函数提供一种返回值的手段,以指示不存在返回值。请阅读this post了解更多详情。

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

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

然后,您像以前一样简单地将方法链接在获取的Optional上。

更新

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

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

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

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

答案 1 :(得分:0)

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