我正在尝试理解和使用Java 8 - 可选功能。我想重构这个代码块。没有可选,我有这样的条件。
ClassA objA = findObject();
if(objA == null || objA.isDeleted()){
throw Exception("Object is not found.");
}
我想使用可选包装器转换此块。我已经阅读了过滤器,如果现在函数,但我找不到方法。也许这很简单,但我是Java 8的新手。如果您能提供帮助,我将不胜感激。
您不应该使用 Optional<T>
来单独替换 if
语句,因为它不会更好,也不会为您带来任何好处。更好的解决方案是使findObject()
方法返回Optional<ClassA>
。
这使得此方法的调用方决定在"无值"情况下要执行的操作。
假设您已经进行了此更改,则可以利用Optional<T>
类型:
findObject().filter(a -> !a.isDeleted()) // if not deleted then do something
.map(...) // do some mapping maybe?
... // do some additional logic
.orElseThrow(() -> new Exception("Object is not found."));//if object not found then throw exception
请参阅 Optional<T>
类以熟悉可用的 API 和方法。
@Eric正如您在评论中提到的,如果您不想(不能(更改某些约束的 findObject(( 的返回类型,您可以执行以下操作:
ClassA objA = findObject();
Optional<ClassA> myOpt =
Optional.ofNullable(objA)
.filter(e->!e.isDeleted())
.orElseThrow(()->new Exception("Object is not found.");
return list.stream()
.filter(tmm -> tmpAddress.type() == 1)
.findFirst()
.orElseThrow(()->{
logger.error("ERROR");//something like this
exceptionHandler.handler("some exception
return null;
});