我有以下功能:
public CompletableFuture<List<String>> getUsers(final String users) {
final CompletionStage<List<String>> cacheFuture = cache.read(users.toString());
return cacheFuture.thenCompose((List<String> userList) -> {
if (userList != null) {
return CompletableFuture.completedFuture(userList);
}
return service.getUsers(users).thenApply((List<String> usersFresh) -> {
cache.write(users.toString(), usersFresh);
return usersFresh;
});
});
}
我得到的编译器错误是:
lambda表达式中的错误返回类型:无法转换列表 到你
在return usersFresh
service.getUsers
的方法签名是:
CompletableFuture<List<String>> getUsers(String users);
我不明白我的代码有什么问题以及无法编译的原因。
答案 0 :(得分:1)
您需要使用CompletionStage
将CompletableFuture
转换为toCompletableFuture
,例如:
public CompletableFuture<List<String>> getUsers(final String users) {
final CompletionStage<List<String>> cacheFuture = cache.read(users.toString());
return cacheFuture.thenCompose((List<String> userList) -> {
if (userList != null) {
return CompletableFuture.completedFuture(userList);
}
return service.getUsers(users).thenApply((List<String> usersFresh) -> {
cache.write(users.toString(), usersFresh);
return usersFresh;
});
}).toCompletableFuture(); //!!! convert `CompletionStage` to `CompletableFuture` in here
}
答案 1 :(得分:1)
与您的方法类似,希望返回ArrayList
,但方法返回List
。
让我们看看:
CompletableFuture<T> implements CompletionStage
您的期望回归:
public CompletableFuture<List<String>>
但cacheFuture.thenCompose
返回CompletionStage
你应该改变:
public CompletableFuture<List<String>> to public CompletionStage<List<String>>