Sometimes I find myself in the situation where I have to perform some asynchronous tasks and perform another asynchronous task when all those tasks have been completed. As always in such situations, I’ve searched stackoverflow for a how-to and the top rated answer suggests the following solution:
That solution totally works and it is good. However, if you often deal with Streams
, a more functional approach would be neat. So I started coding a Collector
that does this operation for me in one go. I won’t go into detail of how a Collector
works, but this blog-post helped me out a lot understanding it.
Finally I ended up with this solution, which I’ve uploaded to github:
And here is how you would use it:
Happy coding!
Update
Obviously it was late yesterday D: The solution I posted was hidden in another answer with less upvotes. It suggest using Collectors.collectAndThen
together with the sequence-method above. In my opinion this is cleaner than following my approach with writing the Collector
on your own (DRY-principle). The final solution is posted below and it contains another Collector
-factory method that can be used if you’re not interested in the results or the CompletableFutures
to collect are of type Void
.
Top comments (1)
Very cool!