comparator 在 completablefuture 异步任务完成后用于对聚合结果排序:先用 allof 并发执行并等待全部完成,再通过 thenapply 提取结果列表,最后用 comparator(如 comparing().reversed())流式排序,全程无阻塞且纯内存操作。

Java 中 Comparator 本身不直接与 CompletableFuture 耦合,但它在异步任务结果的**后处理阶段**(即所有任务完成之后)起关键作用:用于对聚合后的结果集进行排序。真正的配合方式是——先用 CompletableFuture 并发执行多个任务,再用 Comparator 对最终收集到的结果统一排序。
用 CompletableFuture.allOf 汇总多个异步任务
当多个独立异步任务(如查数据库、调远程接口)返回同类型结果时,可创建一组 CompletableFuture<t></t>,用 allOf 等待全部完成,再通过 thenApply 提取并聚合结果:
- 避免阻塞调用
get(),始终用链式thenCompose/thenApply组合 - 每个任务返回一个对象(如
User、Product),统一存入List -
allOf返回CompletableFuture<void></void>,需手动从原始 futures 中获取结果
提取结果后用 Comparator 排序
所有任务完成后,把结果列表传给 Collections.sort() 或 list.stream().sorted(comparator).collect(...)。此时 Comparator 定义排序逻辑,比如按时间倒序、按分数升序:
- 可复用已有比较器:
Comparator.comparing(User::getScore).reversed() - 也可自定义匿名比较器:
(a, b) -> Integer.compare(a.getAge(), b.getAge()) - 注意:排序发生在异步链的末端,属于纯内存操作,不引入新异步行为
完整示例:并发获取用户并按注册时间降序排列
假设三个异步接口分别返回 User 对象:
CompletableFuture<user> task1 = CompletableFuture.supplyAsync(() -> fetchUser(1));
CompletableFuture<user> task2 = CompletableFuture.supplyAsync(() -> fetchUser(2));
CompletableFuture<user> task3 = CompletableFuture.supplyAsync(() -> fetchUser(3));
CompletableFuture<list>> sortedUsers = CompletableFuture.allOf(task1, task2, task3)
.thenApply(v -> Arrays.asList(task1.join(), task2.join(), task3.join()))
.thenApply(list -> list.stream()
.sorted(Comparator.comparing(User::getRegisterTime).reversed())
.collect(Collectors.toList()));
</list></user></user></user>
注意:这里用 join() 是安全的(因 allOf 已确保全部完成),但更推荐用 thenCombine 避免显式阻塞;若任务数动态,可用 Stream.of(futures).reduce(...) 聚合。
进阶:流式合并 + 增量排序(适用于大数据量)
若任务返回的是集合(如每页查询结果),需先 flatMap 合并再排序:
- 用
thenCompose将每个 future 的 List 结果 flatMap 到单一流 - 最后统一
sorted(),避免每个子任务单独排序再归并(易出错且低效) - 大数据场景下可考虑分页+服务端排序,而非全量拉到内存排序
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











