我是Java新手并且正在使用CompletableFutures执行异步操作,如下所示:
public CompletionStage<Either<ErrorResponse, Response>> insertOrUpdate(String actor, String key) {
return this.objectDAO.getByKey(key)
.thenApply(mapDOToContainer(key))
.thenApply(mergeContainerToDO(key, actor))
.thenComposeAsync(this.objectDAO.UpdateFn())
.thenApply(DBResult::finished)
.thenApply(finished -> {
if (finished) {
Response response = Response.ok().build();
return Either.right(response);
} else {
return Either.left(ErrorResponse.create("Error", 400));
}
});
}
现在我需要修改它,这样如果get失败,那么我执行上面的链,但如果它成功,那么我需要打破这个链并从包含ErrorResponse的Either对象的函数返回。
如何打破这个处理链?我知道我可以将一个标志传递给链中的每个函数,并通过根据标志的值执行函数中的操作来实现此目的。我希望有更好的方法来做到这一点。
谢谢!
答案 0 :(得分:0)
我会改写你的代码。
exceptionally
,它专为此然后这样做:
public CompletionStage<Response> insertOrUpdate(String actor, String key) {
return CompletableFuture.supplyAsync(() -> this.objectDAO.getByKey(key))
.thenApply(mapDOToContainer(key))
.thenApply(mergeContainerToDO(key, actor))
.thenComposeAsync(this.objectDAO.UpdateFn())
.thenApply(DBResult::finished)
.thenApply(finished -> {
Response response = Response.ok().build();
return response;
})
.exceptionally(e -> ErrorResponse.create("Error", 400));
}
DAO应该是这样的:
class ObjectDAO {
public Object getByKey(String key) {
if (keyNotFound) {
throw new NoSuchElementException();
}
return new Object();
}
}
您可能必须确保ErrorResponse是Response的子类才能使其正常工作。