applyToEither等待任一CompletableFuture完成即执行回调,不取消另一任务;若先完成者异常,则结果为null,异常需用handle或exceptionally捕获;适用于主备服务快速响应场景。

applyToEither 会等待两个 CompletableFuture 中任意一个完成,然后用它的结果执行后续处理逻辑,另一个未完成的任务会被自动忽略(不取消)。
它只关心“谁先到”,不关心“谁失败”
如果最先完成的是异常完成(exceptionally),applyToEither 会把该异常作为结果传递给后续函数;只有当它调用时两个都还没完成,且其中一个以正常值完成,才会触发函数执行。也就是说:
- 只要有一个完成(无论成功或失败),applyToEither 的回调就会立即执行
- 不会等待另一个;也不会主动 cancel 另一个任务(需手动处理)
- 如果先完成的是异常,你拿到的 result 就是 null,且 exception 可通过 handle 或 exceptionally 捕获
典型用法:带 fallback 的快速响应
比如一个主服务调用 + 一个降级服务调用,取响应更快的那个结果:
CompletableFuture<String> main = callMainService();CompletableFuture<String> fallback = callFallbackService();
CompletableFuture<String> result = main.applyToEither(fallback, s -> "got: " + s);
上面代码中,不管 main 还是 fallback 先返回,s 就是那个返回值;如果其中一个抛了异常,s 可能为 null,此时建议改用 orTimeout + exceptionally 组合来区分场景。
立即学习“Java免费学习笔记(深入)”;
注意:它不等两个都完成,也不组合结果
别把它和 thenCombine 或 allOf 混淆:
-
applyToEither:二选一,快者胜,单参数函数 -
thenCombine:等两个都成功,合并结果,双参数函数 -
anyOf:返回 CompletableFuture<Object>,结果类型擦除,需强制转型,且异常情况更难处理
所以需要“取最快有效结果”时,applyToEither 是简洁安全的选择;但若要求“至少一个成功”,就得额外加异常处理分支。


















