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

What is the correct way of parenthesizing while chaining multiple CompletableFutures?

假设我有两个同名的 类 FooBar 实例,它们分别具有方法 foobar。假设 foo 的 return 类型是 CF<Integer> 并且 bar 的 return 类型是 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));

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

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

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 或响应式编程。