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

时间:2017-01-05 12:57:56

标签: java lambda optional

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

 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)。它不能返回任何值。还有其他办法吗?

4 个答案:

答案 0 :(得分:28)

实际上你在搜索的是:https://datascix.uservoice.com/forums/387207-general/filters/top。您的代码将如下所示:

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 - 对象,我仍然建议您使用isPresent - 方法,而不是-Dweblogic.webservice.i18n.charset=utf-8 等,原因只有一个。 ,我发现它更具可读性(显然是主观决定; - ))。

答案 1 :(得分:12)

我确定在确定值可用后进行映射

private String getStringIfObjectIsPresent(Optional<Object> object) {
   Object ob = object.orElseThrow(MyCustomException::new);
    // do your mapping with ob
   String result = your-map-function(ob);
  return result;
}

或一个班轮

private String getStringIfObjectIsPresent(Optional<Object> object) {
   return your-map-function(object.orElseThrow(MyCustomException::new));
}

答案 2 :(得分:7)

请改用map - 功能。它会转换可选项中的值。

像这样:

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

答案 3 :(得分:5)

这里有两个选项:

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