【发布时间】:2021-05-04 16:07:19
【问题描述】:
我知道关于 SO 的多个问题与这个问题非常相似,但我找不到我希望得到的解决方案。
我的用例在这里很简单。我有一个 Optional 对象,如果 Optional 中的对象存在,我想从 Optiona 对象返回一个值。例如,我想做这样的事情:
private String getUserName(String id) {
// this doesn't work
return fetchUser(id).ifPresent(user -> user.getName()).orElse("DEFAULT_NAME");
}
private Optional<User> fetchUser(String id) {
try {
return Optional.ofNullable(searchUser(id));
} catch (Exception e) {
LOGGER.error("User not found with id {}", id);
return Optional.empty();
}
}
我当然想在这里避免if 块,我也知道ifPresent 需要Consumer,因此ifPresent 中的任何内容都不会返回任何值。但是有没有办法像上面那样以更优雅的方式实现这一点。解决这个问题的方法当然是重写如下代码:
private String getUserName(String id) {
// return fetchUser(id).ifPresent(user -> user.getName()).orElse("DEFAULT_NAME");
Optional<User> user = fetchUser(id);
if(user.isPresent()) {
return user.get().getName();
} else {
return "DEFAULT_NAME";
}
}
我只是想办法避免写if-else
【问题讨论】:
-
您的问题是“如何使用
ifPresent”,但您的问题实际上是通过使用map而不是ifPresent解决的,因为您想返回一个值。所以这是一个XY problem - 如果您搜索问题 ("java return from optional") 而不是您尝试的解决方案 (isPresent),您可能已经找到了解决问题的现有答案。 -
查看这个问题的第二个答案,使用
map和orElse。 Returning from Java Optional ifPresent()