返回带有可选对象的可完成未来列表
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());
我正在尝试 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());