我们假设我有两个同名的Foo
和Bar
个实例,分别有方法foo
和bar
。假设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));
答案 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或反应式编程时。