Java 具有突变的完全未来的恒等函数

Java 具有突变的完全未来的恒等函数,java,completable-future,Java,Completable Future,我正在使用CompletableFutures处理REST调用。 我有一个案例,我必须打两个电话:一个给出结果,我将使用多次;另一个是用前面的结果修改数据库 现在,我这样修复它: final CompletableFuture<A> future1 = f(request); final CompletableFuture<A> future2 = future1.thenCompose(xml -> { g(xml); return Complet

我正在使用
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;
final completablefuture1=f(请求);
final Completable Future future2=future1。然后组合(xml->{
g(xml);
返回CompletableFuture.completedFuture(xml);
});
回归未来2;
但是有没有一种方法可以让我写得更简洁,像这样:

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;
final completablefuture1=f(请求);
final Completable Future future2=future1.thenDoMagic(xml->
g(xml)
);
回归未来2;
因此它将自动返回
future1
的值,即
xml


g
还返回未来

那么,您当前的代码很可能会被调整,以等待未来的完成。就目前而言,您刚刚启动了将在后台运行的
g
,但您的
future2
会立即完成,甚至在
g
完成之前

怎么样

var getXml = f(request); 
return getXml
    // wait for g to complete, but then return xml
    .thenCompose(g)
    .thenCompose(_ -> getXml); 
如果您需要更加简洁,可以创建一个helper方法(比如
),该方法接受
未来
和lambda
X->Future
,等待第二个未来完成(纯粹是为了副作用,忽略结果),然后返回第一个未来的结果

var getXml = f(request);
return andThen(getXml, g);

我认为这没有内置功能。

是阻塞调用还是它也返回未来?
g
也返回未来。然后你
compose
over
g
,否则它不会等待完成。如果您不需要等待,也可以直接返回
future1
。或者您的意思是我直接使用
combine
,这不起作用,因为我需要将
xml
传递给
g
。或者你的意思是我应该只返回
g(xml)
的结果,然后
组合
future1
future2
,这将返回
future1
。这就是我重构的方法。我觉得这种方法更乏味。如果您建议另一种方法,请详细说明或编写一些代码。这几乎是您重构的基础,但不完全是。您的原始版本并没有覆盖
g(xml)
,它只是启动
g
,但忽略了返回的未来。它不等待
g