transpose

If all of the given futures succeed, the returned future's outcome is a list of all their values. The values are in the same order as the futures in the collection, not the order of completion. If at least one given future fails, the returned future's outcome is the first throwable that was thrown. Any subsequent throwables are added to the first one as suppressed throwables, in the order they are thrown. If no futures were given, the returned future has an immediate outcome of empty list. Otherwise the returned future does not have an outcome until all given futures have an outcome. Unlike Guava's Futures.allAsList, this method never hides failures/hangs subsequent to the first failure.