> On 13 Nov 2018, at 10:35 AM, Weijun Wang <weijun.w...@oracle.com> wrote: > > I'm scanning a file and downloading links inside: > > lines.flapMap(x -> Stream.ofNullable(findURIFrom(x))) > .map(l -> download(c, l)) > .forEach(f -> f.join()); > > CompletableFuture<HttpResponse<Path>> download(HttpClient c, URI link) { > return c.sendAsync(HttpRequest.newBuilder(link).build(), > HttpResponse.BodyHandlers.ofFile(Path.of(link.getPath()))); > } > > However, it seems the download is one by one and not parallel. I guess maybe > map() is lazy and each request is only send when forEach() is called and the > next one is only sent after join(). > > I can only collect the jobs into a list and then call join() on > CompletableFuture.allOf(list). Is there a simpler way?
Just guess your Stream (lines) is not parallel, so either use parallel stream or collect into list before join should work? lines.parallel().flapMap(x -> Stream.ofNullable(findURIFrom(x))) .map(l -> download(c, l)) .forEach(f -> f.join()); Or lines.flapMap(x -> Stream.ofNullable(findURIFrom(x))) .map(l -> download(c, l)) .collect(Collectors.toList()) .forEach(f -> f.join()); Regards, Chris > > Thanks > Max