public static ListenableFuture select()

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;
  }