- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有 2 个 retrofit 电话需要进行 A 和 B:
(A):返回一个ArrayList
(B):获取 (A) 的结果,它是一个 ArrayList。 (B) 遍历 ArrayList 并使用每个进行改造调用,并将结果数据组合到最终的 ArrayList 中,该 ArrayList 被发送到我的订阅者 onNext()
我能够让它与 flatmap 一起工作,但解决方案不是很优雅。据我了解,更好的解决方案是将 flatMapIterable 与 concatMap 一起使用,但我似乎无法采用我正在为 flatMapIterable 与 concatMap 所做的工作。
ServiceFactory.createRetrofitService().getUserFollowing(sessionMgr.getAuthToken())
.flatMap(new Func1<UserSelfFollows, Observable<? extends ArrayList<Media.MediaData>>>() {
@Override
public Observable<? extends ArrayList<Media.MediaData>> call(UserSelfFollows userSelfFollows) {
//make second requests based on response from First request to get all Users
ArrayList<Media.MediaData> arAllMedia = new ArrayList<>();
for(UserSelfFollows.UserDataFollows user : userSelfFollows.userdata){
Response <ResponseBody> response ;
Call <ResponseBody> call;
try {
call = ServiceFactory.createRetrofitService().getMediaOfUser(user.id,sessionMgr.getAuthToken());
response = call.execute();
}catch(IOException ex){
return Observable.error(ex);
}
if (response.isSuccessful()) {
try {
String str = responseHelper.streamToString( response.body().byteStream());
Gson gson = new GsonBuilder().create();
Media media = gson.fromJson(str, Media.class);
arAllMedia.addAll(media.mediaData);
} catch (IOException e) {
return Observable.error(e);
}
} else {
return Observable.error( new Exception( responseHelper.getErrorString( response.errorBody().byteStream())) );
}
}
return Observable.just(arAllMedia);
}
})
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<ArrayList<Media.MediaData>>() {
@Override
public final void onCompleted() {
}
@Override
public final void onError(Throwable e) {
}
@Override
public final void onNext(ArrayList<Media.MediaData> arMedia) {
}
})
这是我目前拥有的,但无法编译:
ServiceFactory.createRetrofitService().getUserFollowing(sessionMgr.getAuthToken())
.flatMapIterable(new Func1<UserSelfFollows, Iterable<?>>() {
@Override
public Iterable<?> call(UserSelfFollows userSelfFollows) {
return userSelfFollows.userdata;
}
})
.<Media.MediaData>flatMap(new Func1<UserSelfFollows.UserDataFollows, Observable<Media.MediaData>>() {
@Override
public Observable<Media.MediaData> call(UserSelfFollows.UserDataFollows user) {
return ServiceFactory.createRetrofitService().getMediaOfUser(user.id, sessionMgr.getAuthToken());
}
})
.toList();
错误是:
最佳答案
如果我理解正确你的场景你可以使用flatMapIterable
,然后是flatMap
操作符,最后用toList
收集所有改造调用结果>.
在第一个 flatMapIterable
中,您将从第一次调用 (getUserFollowing()
) 获得的 UserDataFollows
列表扁平化为发出多个项目的 Obsevrable从这个列表中,然后 flatMap
创建一个 Observable
对每个 UserSelfFollows.UserDataFollows
数据对象进行改造调用,(它将并行发生在这里似乎更适合,但如果您对顺序执行感兴趣,也可以使用 concatMap
),然后将所有最终数据收集在一起,作为 MediaData
对象的列表,您可以使用 toList
ServiceFactory.createRetrofitService().getUserFollowing(sessionMgr.getAuthToken())
.flatMapIterable(new Func1<UserSelfFollows, Iterable<?>>() {
@Override
public Iterable<?> call(UserSelfFollows userSelfFollows) {
return userSelfFollows.userdata;
}
})
.flatMap(new Func1<UserSelfFollows, Observable<Media>>() {
@Override
public Observable<Media> call(UserSelfFollows user) {
return ServiceFactory.createRetrofitService().getMediaOfUser(user.id, sessionMgr.getAuthToken());
}
})
.toList()
.subscribe(new Action1<List<Media>>() {
@Override
public void call(List<Media> rs) {
//do something with the list of media data
}
});
关于android - RxJava flatMapIterable 与 concatMap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42268452/
我有一个无限可观察对象(数据库观察者),它发出有限的项目序列,需要对其进行处理,然后作为一个组发回。 这里的问题是,如何编写它使得 toList 不等待原始源完成,而是等待 flatMapIterab
我正在使用 Single 从数据库中检索列表,因为它应该只返回一个值,所以我认为这是一个选择。 我在从要存储在变量中的列表中检索单个值 Long 时遇到问题。 Single> currencyList
在RxJava2中,flatMap()和flatMapIterable()有什么区别? flatMapIterable() 背后的逻辑是什么? 最佳答案 平面 map : 将上游源的值映射到 Obse
我刚开始使用 RxJava 并尝试一个示例项目。 我想要实现的是 -> 获取一个对象->其中包含一个子对象列表 -> 检查子列表是否满足谓词条件 -> 如果满足则发出子对象 这是我的POJO publ
我有 2 个 retrofit 电话需要进行 A 和 B: (A):返回一个ArrayList (B):获取 (A) 的结果,它是一个 ArrayList。 (B) 遍历 ArrayList 并使用每
我正在尝试稍微整理一下我的代码,而 Single 对我来说似乎是一个不错的选择,因为我正在做的事情只会发出一个结果。 我遇到了一个问题,因为我之前使用 flatMapIterable 来获取我的响应(
我已经开始使用 Kotlin Flow。现在我正在努力从一个列表中映射元素,由 api 返回,一个一个地映射。是否有可用的运算符来执行类似 RxJava 的 flatMapIterable 的操作?
这是我想要实现的目标:我有一个 API 响应说 myResponse,其中包含项目的 List。我想通过 flatMapIterable 遍历每个项目,效果很好。但在这样做之前,我想检查 API 是否
作为主题,Flux.concatMapIterable 和 Flux.flatMapIterable 都不会根据大理石图交错,这与 Flux.concatMap 和 Flux.flatMap 其中 f
react 堆新手,试图了解 Mono.flatMapMany和 Mono.flatMapIterable经常处理包含集合的对象的 Mono。 有什么区别: Mono.just(Lis
我是一名优秀的程序员,十分优秀!