您如何访问已传递给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
完成时完成。 如果任何给定的CompletableFuture
exception完成,则返回的CompletableFuture
也CompletableFuture
,并且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); }