Java中优先返回符合特定条件的CompletableFuture结果实现方案
异步API合并优化实现方案
优先方案:不修改遗留类
利用Java 8的CompletableFuture链式调用特性,无需改动现有A、B类即可实现需求逻辑,核心思路是先监听A接口的返回结果,根据条件决定是否提前生成Final对象,或等待B接口结果后合并。
完整代码实现
// 启动两个异步API调用 CompletableFuture<A> futureA = CompletableFuture.supplyAsync(() -> { try { return serviceA.getAPI(); } catch (Exception e) { throw new RuntimeException("A接口调用失败", e); } }); CompletableFuture<B> futureB = CompletableFuture.supplyAsync(() -> { try { return serviceB.getAPI(); } catch (Exception e) { throw new RuntimeException("B接口调用失败", e); } }); // 核心逻辑:根据A的结果决定流程分支 CompletableFuture<Final> finalFuture = futureA.thenCompose(a -> { // 若A的结果为G或H,直接生成Final并返回,无需等待B if ("G".equals(a.resultA) || "H".equals(a.resultA)) { Final finalObj = new Final(); finalObj.resultFinal = "基于A生成:" + a.resultA; return CompletableFuture.completedFuture(finalObj); } else { // 否则等待B返回后,合并A、B结果生成Final return futureB.thenApply(b -> { Final finalObj = new Final(); finalObj.resultFinal = "基于A+B生成:" + a.resultA + "-" + b.resultB; return finalObj; }); } }); // 获取最终结果(可根据业务场景选择join()或异步处理) Final finalResult = finalFuture.join();
方案说明
- 性能优化:当A接口先返回且符合条件时,直接终止流程,避免等待B接口的1-5分钟响应时间,最大化提升效率。
- 异常处理:在异步调用中捕获接口异常,避免未处理的异常导致Future链中断。
- 无侵入:完全基于现有类实现,无需修改遗留的A、B类结构。
备选方案:使用标记接口
若允许修改遗留类,可通过标记接口统一标识响应类,但核心逻辑与优先方案一致,标记接口仅作为类型标识使用:
标记接口定义与类修改
public interface MarkerResponse {} public class A implements MarkerResponse { public String resultA; } public class B implements MarkerResponse { public int resultB; }
实现逻辑
与优先方案完全一致,标记接口仅用于统一响应类的类型标识,未改变核心业务逻辑,适合需要对响应类进行统一管理的场景。
内容的提问来源于stack exchange,提问作者mattsmith5
相关产品推荐
相关产品推荐

