链接多个 CompletableFutures 时加括号的正确方法是什么?
What is the correct way of parenthesizing while chaining multiple CompletableFutures?
假设我有两个同名的 类 Foo
和 Bar
实例,它们分别具有方法 foo
和 bar
。假设 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 或响应式编程。
假设我有两个同名的 类 Foo
和 Bar
实例,它们分别具有方法 foo
和 bar
。假设 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 或响应式编程。