我正在尝试做这样的事情:
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)。它不能返回任何值。还有其他办法吗?
答案 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();
}
}