如何将 Optional 与 ifPresent 一起使用
How to use Optional with ifPresent
我知道有多个关于 SO 的问题与这个问题非常相似,但我找不到我希望得到的解决方案。
我的用例在这里非常简单。我有一个 Optional 对象,如果 Optional 中的对象存在,我想从 Optiona 对象 return 一个值。例如,我想做这样的事情:
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
里面的任何东西都不会 return 任意值。但是有没有办法像上面那样以更优雅的方式实现这一点。解决这个问题的方法当然是重新编写如下代码:
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
使用Optional#map
:
return fetchUser(id).map(User::getName).orElse("DEFAULT_NAME");
我知道有多个关于 SO 的问题与这个问题非常相似,但我找不到我希望得到的解决方案。
我的用例在这里非常简单。我有一个 Optional 对象,如果 Optional 中的对象存在,我想从 Optiona 对象 return 一个值。例如,我想做这样的事情:
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
里面的任何东西都不会 return 任意值。但是有没有办法像上面那样以更优雅的方式实现这一点。解决这个问题的方法当然是重新编写如下代码:
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
使用Optional#map
:
return fetchUser(id).map(User::getName).orElse("DEFAULT_NAME");