CompletableFuture
List<Service> services = Services.getList();
List<CompletableFuture<List<String>>> futures = services.stream()
.map(service -> CompletableFuture.supplyAsync(() -> service.call(param), executor))
.collect(Collectors.toList());
List<String> list = CompletableFuture.allOf(
futures.toArray(new CompletableFuture[futures.size()])
).thenApply(v -> futures.stream()
.map(CompletableFuture::join)
.collect(Collectors.toList())
).join()
.stream()
.filter(CollectionUtils::isNotEmtpy)
.flatMap(List::stream)
.collect(Collectors.toList())
System.out.println(list);