链接多个CompletableFutures时括号的正确方法是什么?

时间:2018-03-21 06:35:08

标签: java asynchronous completable-future

我们假设我有两个同名的FooBar个实例,分别有方法foobar。假设foo的返回类型为CF<Integer>,而条形码的返回类型为CF<String>。现在,这两种链接方式之间的区别是什么?

让我们假设previousFuture是前一次计算的结果。

第一

CompletableFuture<String> result = previousFuture.thenCompose(r -> Foo.foo()).thenCompose(someInteger -> Bar.bar);

第二

CompletableFuture<String> result = previousFuture.thenCompose(r -> Foo.foo().thenCompose(someInteger -> Bar.bar));

1 个答案:

答案 0 :(得分:1)

两者都会产生相同的结果,并会在相同的时刻完成。

主要区别在于第一个解决方案依赖于单个调用链,如果需要,还可以更轻松地访问中间结果:

CompletableFuture<Integer> interm = previousFuture.thenCompose(r -> foo.foo());
CompletableFuture<String> result = interm.thenCompose(someInteger -> bar.bar());

剩下的可能仅仅是风格偏好问题。例如,如果您在多行上格式化它:

CompletableFuture<String> result = previousFuture
        .thenCompose(r -> Foo.foo())
        .thenCompose(someInteger -> Bar.bar);

可能比以下更具可读性和通常性:

CompletableFuture<String> result = previousFuture
        .thenCompose(
            r -> foo.foo().thenCompose(someInteger -> bar.bar())
        );

第一个解决方案更好地显示了您的实际数据流 - 有点像使用Stream API或反应式编程时。