如何统计List<CompletableFuture<Name>>中available为true的Name对象数量?
统计List<CompletableFuture>中available为true的对象总数
要统计这类异步任务列表中符合条件的对象数量,核心是先等待所有异步任务完成,再对结果进行过滤统计,以下是两种常用实现方式:
基础实现(无异常处理)
先通过CompletableFuture.allOf等待所有异步任务执行完毕,再遍历获取结果并统计:
// 等待所有CompletableFuture任务完成 CompletableFuture<Void> allTasksDone = CompletableFuture.allOf(myList.toArray(new CompletableFuture[0])); // 统计available为true的Name对象数量 long availableCount = allTasksDone.thenApply(v -> myList.stream() .map(CompletableFuture::join) // 任务已完成,join不会阻塞 .filter(Name::isAvailable) .count() ).join();
带异常处理的实现
如果某个异步任务可能抛出异常,需要避免整个统计流程失败,可以用exceptionally处理异常场景:
import java.util.Objects; // 等待所有任务完成 CompletableFuture<Void> allTasksDone = CompletableFuture.allOf(myList.toArray(new CompletableFuture[0])); // 统计时处理异常任务,异常任务返回null并跳过 long availableCount = allTasksDone.thenApply(v -> myList.stream() .map(future -> future.exceptionally(e -> null)) // 异常时返回null .map(CompletableFuture::join) .filter(Objects::nonNull) // 过滤掉异常导致的null .filter(Name::isAvailable) .count() ).join();
关键说明
CompletableFuture.allOf会等待传入的所有异步任务完成,返回一个新的CompletableFuture,当所有任务完成时这个新Future才会完成。- 因为已经通过
allOf确保所有任务完成,后续调用CompletableFuture::join不会再阻塞线程,也不会抛出未检查的异常(除非你没处理异常场景)。
内容的提问来源于stack exchange,提问作者Ar_
相关产品推荐
相关产品推荐

