RxJava链式调用:如何通过CommentModel的ownerid获取UserModel
使用RxJava链式调用关联CommentModel与UserModel
看起来你需要把获取评论和获取评论所有者用户的操作串起来,用RxJava的链式调用完全可以实现这个需求。我先假设你的commentRepository里的方法(比如getPostComments())返回的是Observable<List<CommentModel>>,同时你有一个userRepository提供getUserById(String userId)方法返回Observable<UserModel>。
下面是具体的实现代码,我会一步步解释:
// 假设你要获取某个帖子下的所有评论,并关联每个评论的用户信息 commentRepository.getPostComments(targetPostId) // 第一步:把评论列表拆分成单个CommentModel的Observable流 .flatMapIterable(comments -> comments) // 第二步:针对每个评论,调用用户接口获取所有者信息,同时保留评论与用户的关联 .flatMap(comment -> userRepository.getUserById(comment.ownerid) // 把评论和对应的用户组合成一个自定义对象(或者用Pair) .map(user -> new CommentWithUser(comment, user)) ) // 可选:如果需要将结果重新收集为列表,使用toList() .toList() .subscribe( commentWithUserList -> { // 处理最终的评论+用户列表 for (CommentWithUser item : commentWithUserList) { // 这里可以拿到评论item.comment和对应的用户item.user System.out.println("评论者:" + item.user.username + ",内容:" + item.comment.message); } }, throwable -> { // 处理调用过程中的错误(比如网络请求失败、用户不存在等) throwable.printStackTrace(); } );
关键操作符说明:
- flatMapIterable:将列表类型的Observable拆分成单个元素的Observable,这样我们可以逐个处理每条评论。
- flatMap:用于嵌套Observable调用——对于每条评论,我们发起获取用户的请求,同时通过
map把评论和用户绑定在一起,避免丢失上下文。 - toList():如果你的业务需要把所有结果汇总成一个列表再处理,就加上这个操作符;如果不需要,直接在
flatMap之后处理单个的CommentWithUser对象即可。
自定义关联对象(可选)
上面的代码里用了CommentWithUser类来绑定评论和用户,你可以自己定义这个类:
class CommentWithUser { public final CommentModel comment; public final UserModel user; public CommentWithUser(CommentModel comment, UserModel user) { this.comment = comment; this.user = user; } }
如果你的commentRepository返回的是单个CommentModel(而不是列表),那代码会更简单,去掉flatMapIterable即可:
commentRepository.getSingleComment(commentId) .flatMap(comment -> userRepository.getUserById(comment.ownerid) .map(user -> new CommentWithUser(comment, user)) ) .subscribe( commentWithUser -> { // 处理单条带用户信息的评论 }, throwable -> { // 错误处理 } );
内容的提问来源于stack exchange,提问作者vihkat
相关产品推荐
相关产品推荐

