具有突变的 CompletableFuture 的身份函数
Identity function for CompletableFuture with mutation
我正在使用 CompletableFuture
s 来处理我的 REST 调用。
我有一个案例,我必须进行两次调用:一个给出结果,我将多次使用它;另一个用以前的结果修改数据库。
现在,我这样修复它:
final CompletableFuture<A> future1 = f(request);
final CompletableFuture<A> future2 = future1.thenCompose(xml -> {
g(xml);
return CompletableFuture.completedFuture(xml);
});
return future2;
但是有什么方法可以让我写得更简洁,像这样:
final CompletableFuture<A> future1 = f(request);
final CompletableFuture<A> future2 = future1.thenDoMagic(xml ->
g(xml)
);
return future2;
这样它会自动 return future1
的值,即 xml
?
g
also returns a future
那么您当前的代码很可能会被调整为等待那个未来的完成。就目前而言,您只是开始 g
,这将在后台 运行,但您的 future2
立即完成,甚至在 g
完成之前。
怎么样
var getXml = f(request);
return getXml
// wait for g to complete, but then return xml
.thenCompose(g)
.thenCompose(_ -> getXml);
如果你需要它更简洁,你可以制作一个辅助方法(比如andThen
),它接受一个Future<X>
和一个lambda X -> Future<?>
,等待第二个未来完成(纯粹是为了副作用,忽略结果)然后返回第一个的结果。
var getXml = f(request);
return andThen(getXml, g);
我认为没有内置的。
我正在使用 CompletableFuture
s 来处理我的 REST 调用。
我有一个案例,我必须进行两次调用:一个给出结果,我将多次使用它;另一个用以前的结果修改数据库。
现在,我这样修复它:
final CompletableFuture<A> future1 = f(request);
final CompletableFuture<A> future2 = future1.thenCompose(xml -> {
g(xml);
return CompletableFuture.completedFuture(xml);
});
return future2;
但是有什么方法可以让我写得更简洁,像这样:
final CompletableFuture<A> future1 = f(request);
final CompletableFuture<A> future2 = future1.thenDoMagic(xml ->
g(xml)
);
return future2;
这样它会自动 return future1
的值,即 xml
?
g
also returns a future
那么您当前的代码很可能会被调整为等待那个未来的完成。就目前而言,您只是开始 g
,这将在后台 运行,但您的 future2
立即完成,甚至在 g
完成之前。
怎么样
var getXml = f(request);
return getXml
// wait for g to complete, but then return xml
.thenCompose(g)
.thenCompose(_ -> getXml);
如果你需要它更简洁,你可以制作一个辅助方法(比如andThen
),它接受一个Future<X>
和一个lambda X -> Future<?>
,等待第二个未来完成(纯粹是为了副作用,忽略结果)然后返回第一个的结果。
var getXml = f(request);
return andThen(getXml, g);
我认为没有内置的。