我的人类别如下:
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
答案 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;
您当然可以两者都做,但这将是多余的。