All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.pivovarit.collectors.FutureCollectors Maven / Gradle / Ivy

There is a newer version: 3.2.0
Show newest version
package com.pivovarit.collectors;

import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.stream.Collector;
import java.util.stream.Collectors;

import static java.util.stream.Collectors.toList;

/**
 * @author Grzegorz Piwowarek
 */
final class FutureCollectors {
    static  Collector, ?, CompletableFuture> toFuture(Collector collector) {
        return Collectors.collectingAndThen(toList(), list -> {
            CompletableFuture future = CompletableFuture
              .allOf(list.toArray(new CompletableFuture[0]))
              .thenApply(__ -> list.stream()
                .map(CompletableFuture::join)
                .collect(collector));

            // CompletableFuture#allOf doesn't shortcircuit on exception so that requires manual handling
            for (CompletableFuture f : list) {
                f.whenComplete((t, throwable) -> {
                    if (throwable != null) {
                        future.completeExceptionally(throwable);
                    }
                });
            }

            return future;
        });
    }

    static  Collector, ?, CompletableFuture>> toFuture() {
        return toFuture(toList());
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy