如何将 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");