如何实现从CompletableFuture<List<String>>获取用户名列表的CompletableFuture
完整实现代码
import java.util.Arrays; import java.util.List; import java.util.concurrent.CompletableFuture; import java.util.stream.Collectors; public class UserService { public CompletableFuture<List<String>> getUsernames() { return getIds().thenCompose(ids -> { // 将每个ID转换为获取用户名的异步任务 CompletableFuture<String>[] usernameFutures = ids.stream() .map(this::getUsername) .toArray(CompletableFuture[]::new); // 等待所有异步任务完成后,收集结果列表 return CompletableFuture.allOf(usernameFutures) .thenApply(v -> Arrays.stream(usernameFutures) .map(CompletableFuture::join) .collect(Collectors.toList())); }); } // 假设这是已实现的获取ID列表的异步方法 private CompletableFuture<List<String>> getIds() { // 示例:模拟异步返回ID列表 return CompletableFuture.supplyAsync(() -> List.of("1", "2", "3")); } private CompletableFuture<String> getUsername(String id) { // 这里替换为你的实际异步逻辑(比如远程调用、DB查询等) // 示例:模拟异步返回对应用户名 return CompletableFuture.supplyAsync(() -> "user_" + id); } }
核心逻辑说明
thenCompose的作用:避免嵌套的CompletableFuture结构,直接将getIds()返回的ID列表结果传递给下一个异步处理流程,保证代码扁平化。allOf的特性:它会等待传入的所有异步任务全部完成,但本身仅返回CompletableFuture<Void>,不携带任务结果,所以需要后续通过thenApply收集结果。- 结果收集的安全性:因为
allOf已经确保所有usernameFutures都完成,调用join()不会阻塞线程,异常会被自动包装为CompletionException,符合CompletableFuture的异常处理机制。
内容的提问来源于stack exchange,提问作者Cheesy Chameleon
相关产品推荐
相关产品推荐

