applytoeither是completablefuture中用于任一异步任务先完成时立即转换其结果的方法;它接收另一个completablefuture和转换函数,返回新completablefuture,异常会直接传播,不等待另一任务完成。

applyToEither 是 Java 8 引入的 CompletableFuture 中的一个组合方法,用于**在两个异步任务中任一完成时,立即对其结果执行指定函数,并返回一个新的 CompletableFuture**。它不关心哪个先完成,只取“第一个到达的结果”做后续处理。
核心用法:基本语法与含义
方法签名如下:
public <u> CompletableFuture<u> applyToEither(CompletableFuture extends T> other,
Function super T, U> fn)</u></u>
-
other:另一个待组合的 CompletableFuture(类型可不同) -
fn:对“先完成的那个 future 的结果”执行的转换函数 - 返回值是新的
CompletableFuture<u></u>,其结果是fn.apply(先完成结果) - 如果任一 future 以异常完成,新 future 也会以相同异常完成(除非被 handle 拦截)
典型使用场景示例
比如你有两个获取用户信息的异步服务(主库 + 备份缓存),想用响应更快的那个结果:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
CompletableFuture<string> fromDb = CompletableFuture.supplyAsync(() -> {
sleep(2000); // 模拟数据库慢
return "user_from_db";
});
CompletableFuture<string> fromCache = CompletableFuture.supplyAsync(() -> {
sleep(500); // 模拟缓存快
return "user_from_cache";
});
// 取先返回的那个,并转成大写
CompletableFuture<string> firstResult = fromDb.applyToEither(fromCache, String::toUpperCase);
firstResult.thenAccept(System.out::println); // 输出:USER_FROM_CACHE</string></string></string>
注意:applyToEither 是“单向绑定”——它只把 fromDb 当作主 future,fromCache 是 other;但实际执行时谁先完成谁被选中,和主次无关。
重要细节与注意事项
- 不会等待两个都完成:只要有一个完成(正常或异常),就触发函数;另一个未完成的任务会继续运行,但其结果被忽略(除非有额外监听)
-
异常传播:如果先完成的是异常(如超时、空指针),
fn不会被调用,新 future 直接失败;可用orTimeout或exceptionally做兜底 -
类型兼容性:两个 future 的泛型类型可以不同,但
fn参数类型必须匹配“先完成者”的类型;若不确定,可用Object接收再判断 -
替代方案对比:
-
acceptEither:不产生新结果,只消费(void 操作) -
runAfterEither:不关心结果,只在任一完成时执行 Runnable -
anyOf:返回CompletableFuture<object></object>,需手动 cast 和处理异常,灵活性低
-
带错误处理的安全写法
为避免因任一 future 异常导致整体失败,可提前兜底:
CompletableFuture<string> safeDb = fromDb.exceptionally(t -> "fallback_db");
CompletableFuture<string> safeCache = fromCache.exceptionally(t -> "fallback_cache");
safeDb.applyToEither(safeCache, s -> "[OK] " + s)
.thenAccept(System.out::println);</string></string>
这样即使某个服务挂了,也能拿到 fallback 值参与比较。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










