You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何统计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_

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 16:33:11