gpt4 book ai didi

java - 在句柄 block 中执行 CompletionStage 的正确方法是什么?

转载 作者:行者123 更新时间:2023-12-02 01:53:36 24 4
gpt4 key购买 nike

我正在执行一个可能返回异常的 CompletionStage - 它正在尝试将记录插入数据库。如果我收到“重复记录”异常,我想检索已经存在的记录。

这是我的代码:

MyObj obj = new MyObj();
obj.setUserId(userId);
obj.setEventId(eventId);

return database.insert(obj).handle((s, t) -> {
if(t != null) { //TODO: check exception type
CompletionStage<MyObj> recover = database.get(userId, eventId).thenApply(opt -> opt.get());
try {
return recover.toCompletableFuture().get();
}
catch(Exception e) { //TODO: check specific exception types
throw new CompletionException(e);
}
}
else {
return obj;
}
});

这似乎可行,但我认为它看起来很困惑。我理想地想这样做:

MyObj obj = new MyObj();
obj.setUserId(userId);
obj.setEventId(eventId);

return database.insert(obj).handle((s, t) -> {
if(t != null) { //TODO: check exception type
return database.get(userId, eventId).thenApply(opt -> opt.get());
}
else {
return obj;
}
});

“handle”语法不允许我直接在此处返回 CompletionStage/CompletableFuture。所以,我需要使用那种困惑的 try/catch 和“toCompletableFuture().get()”。

我对 CompletionStage/CompletableFuture 语法不太熟悉。有更好的方法来编写这段代码吗?

最佳答案

return database.insert(obj)
.exceptionally (exception -> database.get(userId, eventId).thenApply(opt -> opt.get()));

您可以使用异常(exception)来完成这件事。如果抛出异常,则执行Function并将结果提供给后续任务,否则这是透明的。

关于java - 在句柄 block 中执行 CompletionStage 的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52618356/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com