CompletableFuture 组合处理 allOf 和 anyOf太赞了!

7,358 阅读2分钟

allOf 和 anyOf 可以组合任意多个 CompletableFuture。函数接口定义如下所示。

首先,这两个函数都是静态函数,参数是变长的 CompletableFuture 的集合。其次,allOf 和 anyOf 的区别,前者是「与」,后者是「或」。

例 1:allOf

allOf 的返回值是 CompletableFuture类型,这是因为 每个传入的 CompletableFuture 的返回值都可能不同,所以组合的结果是 无法用某种类型来表示的,索性返回 Void 类型。那么,如何获取每个 CompletableFuture 的执行结果呢?

参看下面的例子: 并行地下载 100 个网页。待下载完成之后,统计在 100 个网页中,含有某个单词的网页个数。

这里有个关键问题,因为allof没有返回值,所以通过theApply,给allFutures附上一个回调函数。在回调函数里面,以此调用么一个Future的Get()函数,获取到100个结果,存入List

接下里要做就是统计这100个网页中,含有单词[XXX] 的网页的个数

例 2:anyOf

anyOf 的含义是只要有任意一个 CompletableFuture 结束,就可以做 接下来的事情,而无须像 AllOf 那样,等待所有的 CompletableFuture 结束。

但由于每个 CompletableFuture 的返回值类型都可能不同,任意一个, 意味着无法判断是什么类型,所以 anyOf 的返回值是 CompletableFuture类型。 考虑下面的例子。

在该例子中,因为future1、future2、future3的返回值都是CompletableFuture,所以anyOf的返回的Object一定也是 String 类型。

并且在 3 个 future 中,future2 睡眠时间最短,会最先执行完成, anyOfFuture.get()获取的也就是 future2 的内容。future1、future3 的 返回结果被丢弃了

回顾整个CompletableFuture的用法主要可概括为以下几点