【问题标题】:How to use Optional with ifPresent [duplicate]如何在 ifPresent 中使用 Optional [重复]
【发布时间】: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),您可能已经找到了解决问题的现有答案。
  • 查看这个问题的第二个答案,使用maporElseReturning from Java Optional ifPresent()

标签: java java-8 optional


【解决方案1】:

使用Optional#map:

return fetchUser(id).map(User::getName).orElse("DEFAULT_NAME");

【讨论】:

  • 谢谢,这真的很有帮助。这正是我想要的
  • @RDM 很高兴为您提供帮助。
猜你喜欢
  • 2017-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多