Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 完成阶段的分配_Java_Asynchronous_Completable Future - Fatal编程技术网

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
,这样就不会出现问题。