applytoeither返回第一个完成的completablefuture结果并应用转换函数,不等待另一个、不合并结果;若先完成的是异常,则新future也以该异常完成,需用exceptionally等兜底。

applyToEither 用于在两个 CompletableFuture 中“选一个先完成的”,对其结果执行函数处理,并返回一个新的 CompletableFuture。它不关心哪个先完成,只取**第一个到达的结果**,然后应用你指定的转换逻辑。
核心行为:谁快选谁,只用一次结果
它不会等待两个都完成,也不会合并或比较结果。只要有一个完成(无论成功或异常),就立即触发函数;如果另一个后续完成,它的结果会被忽略。
注意:如果先完成的是异常(如抛出 RuntimeException),applyToEither 返回的 future 也会以该异常完成——它不自动“跳过失败”。需要配合 exceptionally 或 handle 做兜底。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
基本用法示例:选响应最快的 API 调用
假设你有两个异步查询用户信息的接口,想用响应更快的那个:
CompletableFuture<string> userFromCache = CompletableFuture.supplyAsync(() -> {
sleep(100); // 模拟缓存快
return "cached-user";
});
CompletableFuture<string> userFromDB = CompletableFuture.supplyAsync(() -> {
sleep(300); // 模拟 DB 慢
return "db-user";
});
// 取先完成的那个,并转成大写
CompletableFuture<string> fastest = userFromCache.applyToEither(
userFromDB,
name -> name.toUpperCase()
);
System.out.println(fastest.join()); // 输出:CACHED-USER
</string></string></string>
常见注意事项和技巧
- 两个 future 必须是独立启动的(比如都用
supplyAsync),否则可能串行执行,失去“竞速”意义 - 若需处理失败情况,链式添加
exceptionally:fastest.exceptionally(ex -> "fallback-user")
- 如果想“不管谁快,都要执行某操作”,用
acceptEither(消费型,无返回值) - 如果想等**两个都完成**再选一个,不能用
applyToEither,应改用allOf+ 手动比较
与 applyToEitherAsync 的区别
applyToEitherAsync 会把转换函数提交到默认 ForkJoinPool 或指定线程池中异步执行;而 applyToEither 默认在**完成那个 future 的线程中同步执行**函数。高耗时转换建议用 Async 版本,避免阻塞完成线程。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










