gpt4 book ai didi

java - RxJava2 组合多个可观察量以使它们返回单个结果

转载 作者:行者123 更新时间:2023-12-02 11:18:33 27 4
gpt4 key购买 nike

如何将可观察对象发出的多个结果合并为一个结果并发出一次?

我有改造服务:

public interface MyService {

@GET("url")
Observable<UserPostsResult> getUserPosts(@Query("userId") int id);

@GET("url")
Observable<UserPostsResult> getUserPosts(@Query("userId") int id, @Query("page") int pageId);
}

我有一个模型:

public class UserPostsResult {

@SerializedName("posts")
List<UserPost> mPosts;

@SerializedName("nextPage")
int mPageId;
}

我还有 ID List<Integer> friendsIds;

我的目标是拥有一种像这样的方法:

public Observable<Feed> /*or Single<Feed>*/ getFeed(List<Integer> ids) {
...
}

它返回一个 ObservableSingle执行以下操作:

  • 合并所有 getUserPosts(idFromList)到一个可观察的
  • 对于每个 UserPostsResult必须做:

    if (userPostResult.mPageId > -1)
    getUserPosts(currentUserId, userPostResult.mPageId);

    并将此结果合并到之前的 userPostResult

  • 返回一个模型作为所有操作的结果。

结果类别:

public class Feed {
List<UserPost> mAllPostsForEachUser;
}

编辑(更多详细信息):

我的客户规范是我必须从社交网络用户帖子中获取内容,无需登录,无需 token 请求。所以我必须解析 HTML 页面。这就是为什么我有这个复杂的结构。

编辑(部分解决方案)

public Single<List<Post>> getFeed(List<User> users) {
return Observable.fromIterable(users)
.flatMap(user-> mService.getUserPosts(user.getId())
.flatMap(Observable::fromIterable))
.toList()
.doOnSuccess(list -> Collections.sort(list, (o1, o2) ->
Long.compare(o1.getTimestamp(), o2.getTimestamp())
));
}

此解决方案不包括页面问题。这就是为什么它只是部分解决方案

最佳答案

有许多运算符可以将事物转换为其他事物。 fromIterable() 将发出可迭代中的每个项目,而 flatMap() 将把一种类型的 observable 转换为另一种类型的 observable 并发出这些结果。

Observable.fromIterable( friendsIds )
.flatMap( id -> getUserPosts( id ) )
.flatMap( userPostResult -> userPostResult.mPageId
? getUserPosts(currentUserId, userPostResult.mPageId)
: Observable.empty() )
.toList()
.subscribe( posts -> mAllPostsForEachUser = posts);

关于java - RxJava2 组合多个可观察量以使它们返回单个结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50088523/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com