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方法(比如和),该方法接受未来和lambdaX->Future
,等待第二个未来完成(纯粹是为了副作用,忽略结果),然后返回第一个未来的结果
var getXml = f(request);
return andThen(getXml, g);
我认为这没有内置功能。是阻塞调用还是它也返回未来?g
也返回未来。然后你compose
overg
,否则它不会等待完成。如果您不需要等待,也可以直接返回future1
。或者您的意思是我直接使用combine
,这不起作用,因为我需要将xml
传递给g
。或者你的意思是我应该只返回g(xml)
的结果,然后组合future1
和future2
,这将返回future1
。这就是我重构的方法。我觉得这种方法更乏味。如果您建议另一种方法,请详细说明或编写一些代码。这几乎是您重构的基础,但不完全是。您的原始版本并没有覆盖g(xml)
,它只是启动g
,但忽略了返回的未来。它不等待g
。