in src/main/java/com/spotify/futures/FuturesExtra.java [182:211]
public static <T> ListenableFuture<T> select(
final List<? extends ListenableFuture<T>> futures, final Executor executor) {
Preconditions.checkNotNull(futures);
if (futures.isEmpty()) {
return Futures.immediateFailedFuture(new NoSuchElementException("List is empty"));
}
final int count = futures.size();
final AtomicInteger failures = new AtomicInteger();
final SettableFuture<T> promise = SettableFuture.create();
final FutureCallback<T> cb =
new FutureCallback<T>() {
@Override
public void onSuccess(final T result) {
promise.set(result);
}
@Override
public void onFailure(Throwable t) {
if (failures.incrementAndGet() == count) {
promise.setException(t);
}
}
};
for (final ListenableFuture<T> future : futures) {
Futures.addCallback(future, cb, executor);
}
return promise;
}