该CompletableFuture#allOf
方法不公开CompletableFuture
传递给它的已完成实例的集合.
返回
CompletableFuture
在所有给定CompletableFuture
s完成时完成的新内容.如果任何给定的CompletableFuture
s完全异常,则返回CompletableFuture
也会这样做,并将CompletionException
此异常作为其原因.否则,给定CompletableFuture
s 的结果(如果有的话)不会反映在返回的结果中CompletableFuture
,但可以通过单独检查它们来获得.如果未CompletableFuture
提供s,则返回CompletableFuture
带有值的 完成null
.
请注意,allOf
还会考虑已完成的异常完成的期货.所以你不会总是有一个Person
合作.你可能实际上有一个异常/ throwable.
如果您知道CompletableFuture
正在使用的s 数量,请直接使用它们
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
方法(@Test
现在忽略它是a )来返回Person[]
包含Person
已完成的期货中的所有对象,你可以做
@Test public Person[] combinePersons() throws Exception { CompletableFuturep1 = 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); }