返回带有可选对象的可完成未来列表

Returning List of completable future with Optional object

我正在尝试 return 一个可完成的未来列表,如下所示,

List<CompletableFuture<Optional<ModelObject>>> collect = 
            listOfModel.
            stream().
            map(modelObject -> CompletableFuture.supplyAsync(
                    ()-> {
                        try {
                                return   callMethodWithReturnTypeOfOptional<ModelObject>(modelObject);
                        } catch(Exception e) {
                            LOGGER.error("Something bad happened");
                            return null; // what should be returned here?
                            // return Optional.<ModelObject>empty(); 
                        }
                    }
            , executor)).
            collect(Collectors.<CompletableFuture<Optional<ModelObject>>>toList());

这里有没有更好的异常处理方式? 返回 Optional.empty();是一个好习惯? 感谢您的帮助!

不清楚为什么 callMethodWithReturnTypeOfOptional returns 一个 Optional 抛出异常,但是如果我们假设返回一个空的可选并抛出异常有不同的含义,我们不应该丢弃该信息。所以答案是,你根本不应该捕获异常,以便 CompletableFuture 可以报告它。如果有问题的方法声明 checked 异常,只需捕获、包装并重新抛出它们:

List<CompletableFuture<Optional<ModelObject>>> collect = 
    listOfModel.stream()
    .map(modelObject -> CompletableFuture.supplyAsync(
        ()-> {
            try {
                return callMethodWithReturnTypeOfOptional(modelObject);
            } catch(Exception e) {
                throw new CompletionException(e);
            }
        },
        executor))
    .collect(Collectors.toList());

使用 CompletionException 作为包装异常的优点是 CompletableFuture 不会将异常包装在另一个 CompletionException 中,因此这种异常类型是传递给的操作中的自然选择CompletableFuture.

请注意,您可以在此处避免以自然方式捕获 lambda 表达式:

List<CompletableFuture<Optional<ModelObject>>> collect = 
    listOfModel.stream()
    .map(CompletableFuture::completedFuture)
    .map(f -> f.thenApplyAsync(
        modelObject -> {
            try {
                return callMethodWithReturnTypeOfOptional(modelObject);
            } catch(Exception e) {
                throw new CompletionException(e);
            }
        },
        executor))
    .collect(Collectors.toList());

如果方法没有抛出checked异常,这段代码简化为

List<CompletableFuture<Optional<ModelObject>>> collect = 
    listOfModel.stream()
    .map(CompletableFuture::completedFuture)
    .map(f -> f.thenApplyAsync(Owner::callMethodWithReturnTypeOfOptional, executor))
    .collect(Collectors.toList());