Allow Collector instance to be configured in parameters
This commit is contained in:
parent
97d72e97e4
commit
4dbbe6c32a
@ -7,6 +7,7 @@ import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
import java.util.function.Function;
|
||||
import java.util.stream.Collector;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
public class UtilFuture
|
||||
@ -16,20 +17,39 @@ public class UtilFuture
|
||||
* This is a workaround for {@link CompletableFuture#anyOf(CompletableFuture[])} returning void.
|
||||
*
|
||||
* @param futures the futures to wait to complete
|
||||
* @param <T> the return type of the supplied futures
|
||||
* @param <T> the type of item(s)
|
||||
* @return a future which will complete when all supplied futures have completed
|
||||
*/
|
||||
public static <T> CompletableFuture<List<T>> sequence(List<CompletableFuture<T>> futures)
|
||||
public static <T> CompletableFuture<List<T>> sequence(Collection<CompletableFuture<T>> futures)
|
||||
{
|
||||
return sequence(futures, Collectors.toList());
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a {@link CompletableFuture} which will complete when supplied futures have completed.
|
||||
* This is a workaround for {@link CompletableFuture#anyOf(CompletableFuture[])} returning void.
|
||||
*
|
||||
* @param futures the futures to wait to complete
|
||||
* @param <R> the collection type
|
||||
* @param <T> the type of the collection's items
|
||||
* @return a future which will complete when all supplied futures have completed
|
||||
*/
|
||||
public static <R, T> CompletableFuture<R> sequence(Collection<CompletableFuture<T>> futures, Collector<T, ?, R> collector)
|
||||
{
|
||||
CompletableFuture<Void> futuresCompletedFuture =
|
||||
CompletableFuture.allOf(futures.toArray(new CompletableFuture[futures.size()]));
|
||||
|
||||
return futuresCompletedFuture.thenApply(v ->
|
||||
futures.stream().map(CompletableFuture::join).collect(Collectors.toList()));
|
||||
futures.stream().map(CompletableFuture::join).collect(collector));
|
||||
}
|
||||
|
||||
public static <T> CompletableFuture<List<T>> filter(List<T> list, Function<T, CompletableFuture<Boolean>> futureFunction)
|
||||
{
|
||||
return filter(list, futureFunction, Collectors.toList());
|
||||
}
|
||||
|
||||
// TODO javadocs
|
||||
public static <T> CompletableFuture<List<T>> filter(List<T> list, Function<T, CompletableFuture<Boolean>> futureFunction)
|
||||
public static <R, T> CompletableFuture<R> filter(List<T> list, Function<T, CompletableFuture<Boolean>> futureFunction, Collector<T, ?, R> collector)
|
||||
{
|
||||
Map<T, CompletableFuture<Boolean>> elementFutureMap = list.stream()
|
||||
.collect(Collectors.toMap(
|
||||
@ -43,6 +63,6 @@ public class UtilFuture
|
||||
elementFutureMap.entrySet().stream()
|
||||
.filter(entry -> entry.getValue().join()) // this doesn't block as all futures have completed
|
||||
.map(Map.Entry::getKey)
|
||||
.collect(Collectors.toList()));
|
||||
.collect(collector));
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user