需要Completable <Void>时,返回Completable <Object>

时间:2019-09-20 18:01:52

标签: java

我的人类别如下:

class Person {
    String name;
    String city;
    public void setInfo(PersonInformation info) {//...};
}

我有一个来自此类的对象的列表,我想使用返回CompletableFuture的方法来异步查询列表中每个项目的数据库,以填充其信息:

List<CompletableFuture<Void>> populateInformation(List<Person> people) {
     return people.stream().
            .collect(groupingBy(p -> p.getLocation(), toList()))
            .entrySet().stream()
            .map(entry -> 
                    CompletableFuture.supplyAsync(
                            () -> db.getPeopleInformation(entry.getKey())
                    ).thenApply(infoList -> { 
                                    //do something with info list that doens't return anything
                                    // apparently we HAVE to return null, as callanbles have to return a value
                                    return null;
                                }
                    )
            ).collect(Collectors.toList());
}

问题是我得到一个编译错误,因为该方法中的代码返回CompletableFuture<List<Object>>而不是CompletableFuture<List<Void>>。我在这里做什么错了?

我曾考虑删除return null,但是正如我在评论中提到的那样,似乎在可调用对象中我们必须返回一个值,否则将出现另一个编译错误:Incompatible types: expected not void but the lambda body is a block that is not value-compatible

2 个答案:

答案 0 :(得分:2)

thenApply方法的返回类型为it('renders without errors ', () => { html = mount(<ExampleView/>); await new Promise(resolve => setTimeout(resolve)) html.update() console.log(html.html()); }); ,这意味着使用函数返回的值返回CompletableFuture

CompletableFuture<U>

返回一个新的public <U> CompletableFuture<U> thenApply(Function<? super T,? extends U> fn) ,当此阶段正常完成时,将使用该阶段的结果作为所提供函数的参数来执行此操作。有关涵盖特殊完成的规则​​,请参阅CompletionStage文档。

CompletionStage

使用thenAccept方法返回Void类型的CompletableFuture

Type Parameters:
U - the function's return type

Parameters:
fn - the function to use to compute the value of the returned CompletionStage

返回一个新的CompletionStage,当该阶段正常完成时,将使用该阶段的结果作为所提供操作的参数来执行该阶段。有关涵盖特殊完成的规则​​,请参阅CompletionStage文档。

public CompletableFuture<Void> thenAccept(Consumer<? super T> action)

答案 1 :(得分:1)

Answer by Deadpool是正确的解决方案,但是您也可以通过两种方式强制thenApply返回CompletableFuture<Void>

  • 指定通用类型参数:

    ).<Void>thenApply(infoList -> {
    
  • 放弃返回值:

    return (Void) null;
    

您当然可以两者都做,但这将是多余的。