Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 回归完整的未来<;无效>;在条件函数中_Java_Asynchronous_Java 8_Completable Future - Fatal编程技术网

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));
    
    }