【发布时间】:2018-08-31 17:59:19
【问题描述】:
我正在尝试编写一个步骤链,这样我就可以通过创建返回 CompletableFuture<Boolean> 的方法来避免 if 和 else 调用的大型嵌套链,例如......
client.connect(identifier).thenCompose(b -> client.authenticate())
.thenCompose(b -> client.sendSetting(settings))
.thenCompose(b -> client.saveSettings())
.thenCompose(b -> client.sendKey(key))
.thenCompose(b -> client.setBypassMode(true))
.thenCompose(b -> client.start())
.whenComplete((success, ex) -> {
if(ex == null) {
System.out.println("Yay");
} else {
System.out.println("Nay");
}
});
如果客户端方法返回 CompletableFuture<Boolean> 决定是否继续处理必须在链中的每个 lambda 中完成,并且不提供在其中一个调用失败时提前中止的方法。我宁愿让调用返回 CompletableFuture<Void> 并使用 Exceptions 来控制是否 1) 执行链中的每个连续步骤和 2) 最终确定整个链是否成功。
我很难找到 CompletableFuture<Void> 上的哪个方法来交换 thenCompose 以使事情正常运行(更不用说编译了)。
【问题讨论】:
-
还要注意我的调用链长度为 8 步。
-
请发布真实的代码,很难弄清楚挑战是什么,甚至很难理解你真正想要实现的目标。
-
@ernest_k 感谢您的意见。希望这个问题的迭代更清楚。
-
你在做异步操作吗?
settings、key是从哪里来的?它们是局部范围的变量吗? -
是的,每个客户端调用都需要通过串行端口进行 IO。是的,变量是局部作用域的。