allOf for CompletionStage

问题描述

我正在尝试等待 CompletionStage 的列表。这两种方法有什么区别:

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

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

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

解决方法

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

另一方面,第二种方法利用显式设计的 API 方法 toCompletableFuture(),以便从任何 CompletionStage 实现类到 CompletableFuture 进行互操作。