首页 > 解决方案 > allOf 用于 CompletionStage

问题描述

我正在尝试等待CompletionStage. 两种方法有什么区别:

1. CompletableFuture.allOf(test.toArray(new CompletableFuture[0])).join();

2. CompletableFuture.allOf(test.stream().map(CompletionStage::toCompletableFuture)
          .toArray(CompletableFuture[]::new)).join();

IntelliJ 显示第一个警告,指出预期类型 isCompletableFuture[]和 not CompletionStage[]。我写了一个小测试,似乎两者的行为相同。是否有一种首选或“正确”的方式优于另一种?谢谢。(主要是看我是否犯了根本性错误,或者其中一种风格是否更正确)。

标签: javaasynchronouscompletable-future

解决方案


第二个是最安全的 IMO。正如您所说,两者都可以正常工作,但是CompletionStageCompletableFuture(换句话说,CompletableFuture 是 CompletionStage 的实现)的超级接口,因此toArray如果元素的实际类型不是,则在第一种方法中执行操作理论上可能会导致运行时异常CompletableFuture

另一方面,第二种方法利用了toCompletableFuture()明确设计的 API 方法,可以从任何CompletionStage实现类互操作到CompletableFuture.


推荐阅读