使用可选包装器对多个条件执行 OR



我正在尝试理解和使用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;
        });

最新更新