问题描述
我正在尝试等待 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。正如您所说,两者都可以正常工作,但是 CompletionStage
是 CompletableFuture
的超级接口(换句话说,CompletableFuture 是 CompletionStage 的实现),因此理论上可以像第一种方法那样执行 toArray
如果元素的实际类型不是 CompletableFuture
,则会导致运行时异常。
另一方面,第二种方法利用显式设计的 API 方法 toCompletableFuture()
,以便从任何 CompletionStage
实现类到 CompletableFuture
进行互操作。