您如何访问已传递给CompletableFuture allOf的已完成期货?

我试图掌握Java 8 CompletableFuture。 我怎样才能将这些人加入到“allOf”之后再归还给他们。 下面的代码不起作用,但让您了解我尝试过的内容。

在javascript ES6中我会这样做

Promise.all([p1, p2]).then(function(persons) { console.log(persons[0]); // p1 return value console.log(persons[1]); // p2 return value }); 

到目前为止我在Java方面的努力

 public class Person { private final String name; public Person(String name) { this.name = name; } public String getName() { return name; } } @Test public void combinePersons() throws ExecutionException, InterruptedException { CompletableFuture p1 = CompletableFuture.supplyAsync(() -> { return new Person("p1"); }); CompletableFuture p2 = CompletableFuture.supplyAsync(() -> { return new Person("p1"); }); CompletableFuture.allOf(p1, p2).thenAccept(it -> System.out.println(it)); } 

CompletableFuture#allOf方法不公开传递给它的已完成CompletableFuture实例的集合。

返回一个新的CompletableFuture ,它在所有给定的CompletableFuture完成时完成。 如果任何给定的CompletableFutureexception完成,则返回的CompletableFutureCompletableFuture ,并且CompletionException将此exception作为其原因。 否则,给定的CompletableFuture的结果(如果有的话)不会反映在返回的CompletableFuture ,但可以通过单独检查它们来获得 。 如果未提供CompletableFuture ,则返回CompletableFuture ,其值为null

请注意, allOf还会考虑已完成的特殊期货。 所以你不会总是有一个Person可以使用。 你可能实际上有一个exception/ throwable。

如果您知道正在使用的CompletableFuture的数量,请直接使用它们

 CompletableFuture.allOf(p1, p2).thenAccept(it -> { Person person1 = p1.join(); Person person2 = p2.join(); }); 

如果你不知道你有多少(你正在使用数组或列表),只需捕获传递给allOf的数组

 // make sure not to change the contents of this array CompletableFuture[] persons = new CompletableFuture[] { p1, p2 }; CompletableFuture.allOf(persons).thenAccept(ignore -> { for (int i = 0; i < persons.length; i++ ) { Person current = persons[i].join(); } }); 

如果你想要你的combinePersons方法( combinePersons忽略它是@Test )来返回包含完成的期货中所有Person对象的Person[] ,你可以做

 @Test public Person[] combinePersons() throws Exception { CompletableFuture p1 = CompletableFuture.supplyAsync(() -> { return new Person("p1"); }); CompletableFuture p2 = CompletableFuture.supplyAsync(() -> { return new Person("p1"); }); // make sure not to change the contents of this array CompletableFuture[] persons = new CompletableFuture[] { p1, p2 }; // this will throw an exception if any of the futures complete exceptionally CompletableFuture.allOf(persons).join(); return Arrays.stream(persons).map(CompletableFuture::join).toArray(Person[]::new); }