Java 完成阶段的分配
我正在尝试等待Java 完成阶段的分配,java,asynchronous,completable-future,Java,Asynchronous,Completable Future,我正在尝试等待CompletionStage的列表。这两种方法的区别是什么: 1. CompletableFuture.allOf(test.toArray(new CompletableFuture[0])).join(); 2. CompletableFuture.allOf(test.stream().map(CompletionStage::toCompletableFuture) .toArray(CompletableFuture[]::new)).join()
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的一个实现),因此,如果元素的实际类型不是CompletableFuture
,那么在第一种方法中执行toArray
,理论上可能会导致运行时异常
另一方面,第二种方法利用API方法
toCompletableFuture()
,如果test
是一个集合
,则该方法被明确设计为从任何CompletionStage
实现类到CompletableFuture进行互操作,以保证这一点。第二种方法是在收集到数组之前将每个元素映射到一个CompletableFuture
,这样就不会出现问题。