Java CompletableFuture.allOf()不';找不到任何数组元素
下面是一个非常简单的代码片段:Java CompletableFuture.allOf()不';找不到任何数组元素,java,future,Java,Future,下面是一个非常简单的代码片段: String[] list = {"a", "b", "c"}; List<CompletableFuture<String>> completableFutureList = new ArrayList<>(); for (String s : list) { completableFutureList.add(CompletableFuture.supplyAsync(() -> s)
String[] list = {"a", "b", "c"};
List<CompletableFuture<String>> completableFutureList = new ArrayList<>();
for (String s : list) {
completableFutureList.add(CompletableFuture.supplyAsync(() -> s)
.thenApply(String::toUpperCase));
}
CompletableFuture<String>[] a = completableFutureList
.toArray(new CompletableFuture[completableFutureList.size()]);
System.out.println(a.length);
CompletableFuture.allOf(a).whenComplete((r, e) -> {
if (null != r) {
System.out.println(r);
} else {
throw new RuntimeException(e);
}
});
String[]list={“a”、“b”、“c”};
List completableFutureList=新建ArrayList();
用于(字符串s:列表){
completableFutureList.add(CompletableFuture.supplyAsync(()->s)
.thenApply(String::toUpperCase));
}
CompletableFuture[]a=completableFutureList
.toArray(新的CompletableFuture[completableFutureList.size()]);
系统输出打印长度(a.长度);
可完成的未来。所有(a)。当完成时((r,e)->{
if(null!=r){
系统输出println(r);
}否则{
抛出新的运行时异常(e);
}
});
我希望程序应该打印“abc”。但实际上什么也没印出来。为什么以及如何解决这个问题?引用了
CompletableFuture.allOf()
方法的Javadoc(强调我的):
返回一个新的CompletableFuture
,当所有
给定的CompletableFutures
complete。如果有任何
CompletableFutures
异常完成,然后返回
CompletableFuture
也会这样做,带有一个CompletionException
将此异常作为其原因否则,结果,
如果有,则给定的可完成期货的
返回的CompletableFuture
,但可以通过以下方式获得:
单独检查。
如果没有CompletableFutures
如果提供,则返回一个CompletableFuture
已完成的值
{@code null}
因此,我认为您需要在whenComplete()
回调中手动查询它们(例如使用a[0].get()
)。大概是这样的:
CompletableFuture.allOf(a).whenComplete((r, e) -> {
for (CompletableFuture<String> future : a) {
try {
System.out.println(future.get());
}
catch (InterruptedException | ExecutionException e1) {
e1.printStackTrace();
}
}
});
CompletableFuture.allOf(a).当完成时((r,e)->{
用于(可完成的未来:a){
试一试{
System.out.println(future.get());
}
捕获(中断异常|执行异常e1){
e1.printStackTrace();
}
}
});
引用CompletableFuture.allOf()
方法的Javadoc(强调我的):
返回一个新的CompletableFuture
,当所有
给定的CompletableFutures
complete。如果有任何
CompletableFutures
异常完成,然后返回
CompletableFuture
也会这样做,带有一个CompletionException
将此异常作为其原因否则,结果,
如果有,则给定的可完成期货的
返回的CompletableFuture
,但可以通过以下方式获得:
单独检查。
如果没有CompletableFutures
如果提供,则返回一个CompletableFuture
已完成的值
{@code null}
因此,我认为您需要在whenComplete()
回调中手动查询它们(例如使用a[0].get()
)。大概是这样的:
CompletableFuture.allOf(a).whenComplete((r, e) -> {
for (CompletableFuture<String> future : a) {
try {
System.out.println(future.get());
}
catch (InterruptedException | ExecutionException e1) {
e1.printStackTrace();
}
}
});
CompletableFuture.allOf(a).当完成时((r,e)->{
用于(可完成的未来:a){
试一试{
System.out.println(future.get());
}
捕获(中断异常|执行异常e1){
e1.printStackTrace();
}
}
});