如何在 ifPresent 中使用 Optional

Rah*_*hra -1 java optional java-8

我知道 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();
        }
    }
Run Code Online (Sandbox Code Playgroud)

我当然试图避免if这里的块,我也知道它ifPresent需要 a 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";
        }
    }
Run Code Online (Sandbox Code Playgroud)

我只是想找到一种避免写作的方法 if-else

hev*_*ev1 9

使用Optional#map

return fetchUser(id).map(User::getName).orElse("DEFAULT_NAME");
Run Code Online (Sandbox Code Playgroud)