具有突变的 CompletableFuture 的身份函数

Identity function for CompletableFuture with mutation

我正在使用 CompletableFutures 来处理我的 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);

我认为没有内置的。