Java 回归完整的未来<;无效>;在条件函数中
我有一个用例,我必须从一个函数返回一个Java 回归完整的未来<;无效>;在条件函数中,java,asynchronous,java-8,completable-future,Java,Asynchronous,Java 8,Completable Future,我有一个用例,我必须从一个函数返回一个CompletableFuture,该函数根据一个条件组成两个completablefutures 以下是我现在拥有的- private CompletableFuture processSomething(最终sometevent事件){ final CompletableFuture detail=dao.getData(event.getOrderId()); 返回详细信息。然后应用(n->n.stream() .filter(i->i.getBusi
CompletableFuture
,该函数根据一个条件组成两个completablefutures
以下是我现在拥有的-
private CompletableFuture processSomething(最终sometevent事件){
final CompletableFuture detail=dao.getData(event.getOrderId());
返回详细信息。然后应用(n->n.stream()
.filter(i->i.getBusinessType().equals(BusinessType.AWESOME))
.findFirst()
.filter(i->i.getLastUpdateEventTimestamp()i
.map(o->deleteItem(事件,o))
.orElse(CompletableFuture.completedFuture(null));//deleteItem是返回CompletableFuture的异步调用
}
社区是否可以检查并建议其他方法?我特别不喜欢显式返回CompletableFuture.completedFuture(null)实现它的方法之一是,只需做两个更改
Optional
作为参数传递给delete
方法并生成
在执行实际逻辑之前,对其进行必要的检查.thencomose()
更改为。然后接受()
。它将返回
CompletionStage
您可以将其转换为CompletableFuture
在方法返回的顶部返回之前实现这一目标的方法之一是,简单地做两个改变
Optional
作为参数传递给delete
方法并生成
在执行实际逻辑之前,对其进行必要的检查.thencomose()
更改为。然后接受()
。它将返回
CompletionStage
您可以将其转换为CompletableFuture
在方法返回的顶部返回之前在函数中为
返回一个已经完成的未来,然后编写,这没有什么错。如中所述,您还可以使用CompletableFuture.allOf()
来表示任务的空列表,以获得相同的结果
但是您可以使用.orElseGet(()->…)
来避免提前构建完整的未来,即使在不需要的时候
此外,您可以用一个然后组合(…)
替换然后应用(…)。然后组合(…)
:
private CompletableFuture processSomething(最终sometevent事件){
CompletableFuture detail=dao.getData(event.getOrderId());
返回详细信息。然后组合(n->n.stream()
.filter(i->i.getBusinessType().equals(BusinessType.AWESOME))
.findFirst()
.filter(i->i.getLastUpdateEventTimestamp()deleteItem(事件,o))
.OrelGet(()->CompletableFuture.completedFuture(null));
//或.orElseGet(()->CompletableFuture.allOf());
//或者.orElseGet(CompletableFuture::allOf));
}
在函数中为返回一个已经完成的未来,然后编写,没有什么错。如中所述,您还可以使用CompletableFuture.allOf()
来表示任务的空列表,以获得相同的结果
但是您可以使用.orElseGet(()->…)
来避免提前构建完整的未来,即使在不需要的时候
此外,您可以用一个然后组合(…)
替换然后应用(…)。然后组合(…)
:
private CompletableFuture processSomething(最终sometevent事件){
CompletableFuture detail=dao.getData(event.getOrderId());
返回详细信息。然后组合(n->n.stream()
.filter(i->i.getBusinessType().equals(BusinessType.AWESOME))
.findFirst()
.filter(i->i.getLastUpdateEventTimestamp()deleteItem(事件,o))
.OrelGet(()->CompletableFuture.completedFuture(null));
//或.orElseGet(()->CompletableFuture.allOf());
//或者.orElseGet(CompletableFuture::allOf));
}
如果使用thenacept()
而不是thencomose()
则返回的未来将在deletItem()
完成之前完成。您可以在thenacept()
中调用join()
暂停当前线程,直到它完成为止?或者它不应该是?好吧,这会有点违背目的,因为这意味着您将消耗2个线程而不是一个线程。请注意,可选
不是设计用作方法参数的。另外,isPresent()
后跟get()
也是一种反模式,或者至少是一种代码味道(有时你无法避免,至少在Java8中是这样)。只需使用ifPresent()
。您还将注意到,在else情况下,新的deleteItem()
方法仍然需要返回completedFuture(null)
。@didierrl是的,我同意它将消耗2个线程。关于反模式,我想我今天学到了一些新东西。感谢您提供的信息。您为什么说然后accept()
返回一个完成阶段
,并且必须强制转换?如果使用thenacept()
而不是thencomose()
则返回的未来将在deletItem()
完成之前完成。您可以通过调用deleteItem()
上的join()
在deleteItem()
中暂停当前线程,直到它完成为止?或者它不应该是?好吧,这会有点违背目的,因为这意味着您将消耗2个线程而不是一个线程。请注意,可选
不是设计用作方法参数的。另外,isPresent()
后跟get()
也是一种反模式,或者至少是一种代码味道(有时你无法避免,至少在Java8中是这样)。只需使用ifPresent()
。您还将注意到,在else情况下,新的deleteItem()
方法仍然需要返回completedFuture(null)
。@didierrl是的,我同意它将消耗2个线程。关于反pat
private CompletableFuture<Void> processSomething(final SomeEvent event) {
final CompletableFuture<PaginatedQueryList<Detail>> detail = dao.getData(event.getOrderId());
return (CompletableFuture<Void>)detail.thenApply(n -> n.stream()
.filter(i -> i.getBusinessType().equals(BusinessType.AWESOME))
.findFirst()
.filter(i -> i.getLastUpdateEventTimestamp() <= event.getCreationTime())) // This returns Optional<Detail>
.thenAccept(i -> deleteItem(event, i).join())); // deleteItem is a async call that returns CompletableFuture<Void>
}
private CompletableFuture<Void> deleteItem(Optional<Detail> optionalDetail){
if(optionalDetail.isPresent()){
// Your existing logic
}
}
.thenAccept(i ->
{
if(i.isPresent()){
deleteItem(event, i.get());
}
});
private CompletableFuture<Void> processSomething(final SomeEvent event) {
CompletableFuture<PaginatedQueryList<Detail>> detail = dao.getData(event.getOrderId());
return detail.thenCompose(n -> n.stream()
.filter(i -> i.getBusinessType().equals(BusinessType.AWESOME))
.findFirst()
.filter(i -> i.getLastUpdateEventTimestamp() <= event.getCreationTime())
.map(o -> deleteItem(event, o))
.orElseGet(() -> CompletableFuture.completedFuture(null)));
// or .orElseGet(() -> CompletableFuture.allOf()));
// or .orElseGet(CompletableFuture::allOf));
}