我试图理解Java 8中的CompletableFuture.作为其中的一部分,我正在尝试进行一些REST调用以巩固我的理解.我正在使用这个库来进行REST调用:https://github.com/AsyncHttpClient/async-http-client.
请注意,此库返回GET调用的Response对象.
以下是我要做的事情:
>调用此URL,该URL提供用户列表:https://jsonplaceholder.typicode.com/users
>使用GSON将响应转换为用户对象列表.
>迭代列表中的每个User对象,获取userID,然后从以下URL获取用户发布的帖子列表:https://jsonplaceholder.typicode.com/posts?userId=1
>使用GSON将每个帖子回复转换为Post对象.
>构建UserPost对象的集合,每个对象都有一个用户对象和用户发布的帖子列表.
public class UserPosts {
private final User user;
private final List
}
我目前实现如下:
package com.CompletableFuture;
import java.util.List;
import java.util.Optional;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.Future;
import java.util.function.Function;
import java.util.stream.Collectors;
import org.asynchttpclient.Response;
import com.http.HttpResponse;
import com.http.HttpUtil;
import com.model.Post;
import com.model.User;
import com.model.UserPosts;
/**
* Created by vm on 8/20/18.
*/
class UserPostResponse {
private final User user;
private final FutureCompletableFuture extends HttpResponse {
private FunctionCompletableFuture() {
super(HttpUtil.getInstance());
}
public ListCompletableFutureCompletableFuture
.supplyAsync(() -> super.getUsers())
.thenApply(userResponseToObject)
.thenApply((List
但是,我不确定我这样做的方式是否正确.更具体地说,在userResponseToObject和postResponseToObject函数中,我调用Future上的get()方法,它将被阻塞.
有没有更好的方法来实现这个?
最佳答案
如果您打算使用CompletableFuture,则应使用async-http-client库中的ListenableFuture. ListenableFuture可以转换为CompletableFuture.
使用CompletableFuture的优点是您可以编写处理Response对象的逻辑,而无需了解有关期货或线程的任何信息.假设您编写了以下4种方法. 2发出请求,2发表解析:
ListenableFuture
CompletableFutureCompletableFuture()
.thenApply(r -> parseUserPosts(r,u));
}
ListCompletableFutureCompletableFuture()
.thenApply(userRequest -> parseUsers(userRequest)
.stream()
.map(this::userPosts)
.collect(toList())
).join();
// collect the results
return postFutures.stream()
.map(CompletableFuture::join)
.flatMap(List::stream)
.collect(toList());
}