Java 8 可选:ifPresent 返回对象或ElseThrow 异常

新手上路,请多包涵

我正在尝试做这样的事情:

  private String getStringIfObjectIsPresent(Optional<Object> object){
        object.ifPresent(() ->{
            String result = "result";
            //some logic with result and return it
            return result;
        }).orElseThrow(MyCustomException::new);
    }

这不起作用,因为 ifPresent 将 Consumer 功能接口作为参数,它具有 void accept(T t)。它不能返回任何值。还有其他方法吗?

原文由 RichardK 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 892
2 个回答

实际上您正在搜索的是: Optional.map 。您的代码将如下所示:

 object.map(o -> "result" /* or your function */)
      .orElseThrow(MyCustomException::new);

如果可以的话,我宁愿省略 Optional 。最后,在这里使用 Optional 你什么也得不到。稍微其他的变体:

 public String getString(Object yourObject) {
  if (Objects.isNull(yourObject)) { // or use requireNonNull instead if NullPointerException suffices
     throw new MyCustomException();
  }
  String result = ...
  // your string mapping function
  return result;
}

如果您已经有了 Optional 由于另一个调用,我仍然建议您使用 map -method,而不是 isPresent 等。唯一的原因,我觉得它更具可读性(显然是一个主观决定;-))。

原文由 Roland 发布,翻译遵循 CC BY-SA 3.0 许可协议

这里有两个选项:

ifPresent 替换为 map 并使用 Function 而不是 Consumer

 private String getStringIfObjectIsPresent(Optional<Object> object) {
    return object
            .map(obj -> {
                String result = "result";
                //some logic with result and return it
                return result;
            })
            .orElseThrow(MyCustomException::new);
}

使用 isPresent

 private String getStringIfObjectIsPresent(Optional<Object> object) {
    if (object.isPresent()) {
        String result = "result";
        //some logic with result and return it
        return result;
    } else {
        throw new MyCustomException();
    }
}

原文由 Vlad Bochenin 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题