Java8可选项: ifCurrent 返回对象或 Elsethrow 异常

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

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

这是不可行的,因为 ifCurrent 采用 Consumer 函数接口作为参数,其中包含 void access (T t)。它不能返回任何值。还有别的办法吗?

190913 次浏览

改为使用 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);
}

实际上,您正在搜索的是: 可选地图:

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-object,我仍然建议您使用 map-方法,而不是 isPresent,等等,原因只有一个,那就是我觉得它更可读(显然是一个主观的决定; ——)。

这里有两个选择:

map代替 ifPresent,用 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();
}
}

在确保值可用之后,我更喜欢映射

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

你举的例子不是一个好例子。可选项不应作为参数发送到另一个函数。好的实践总是将非空参数发送到函数中。这样我们总是知道输入不会为空。这可以减少代码的不确定性。