Java 8 可选:ifPresent return object 或ElseThrow exception

2022-08-31 13:36:45

我正在尝试做这样的东西:

 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)。它不能返回任何值。有没有其他方法可以做到这一点?


答案 1

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

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

如果可以的话,我宁愿省略通过。最后,使用这里你不会得到任何好处。稍微另一个变体:OptionalOptional

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;
}

如果您由于另一个调用而已经有了 -object,我仍然建议您使用 -method,而不是 等,原因只有一个,我发现它更具可读性(显然是主观决定 ;-))。OptionalmapisPresent


答案 2

这里有两个选项:

替换为和使用,而不是ifPresentmapFunctionConsumer

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();
    }
}

推荐