rxjava:发出所有可观察结果中的一个结果,而不是多个
这种情况是使用字符串列表参数调用我的getData()方法。对于每个字符串,我都需要在getDataPerItem()中执行一些操作。最后,每次调用getDataPerItem()的结果都应该合并到一个大列表中(保持结果的顺序),getData()应该在一个列表中发出所有结果。使用当前方法,它将分别为每个标识符发出一个列表。如何将所有结果合并为一个rxjava:发出所有可观察结果中的一个结果,而不是多个,java,rx-java,Java,Rx Java,这种情况是使用字符串列表参数调用我的getData()方法。对于每个字符串,我都需要在getDataPerItem()中执行一些操作。最后,每次调用getDataPerItem()的结果都应该合并到一个大列表中(保持结果的顺序),getData()应该在一个列表中发出所有结果。使用当前方法,它将分别为每个标识符发出一个列表。如何将所有结果合并为一个 public Observable<List<Model>> getData(List<String> iden
public Observable<List<Model>> getData(List<String> identifiers) {
return Observable.from(identifiers).flatMap { identifier -> getDataPerItem(identifier) };
}
public Observable<List<Model>> getDataPerItem(String identifier) {
return xxx;
}
公共可观察的getData(列表标识符){
返回Observable.from(identifiers).flatMap{identifier->getDataPerItem(identifier)};
}
公共可观测getDataPerItem(字符串标识符){
返回xxx;
}
有几种方法可以实现这一点:
一种解决方案是使用concatMapIterable
,然后收集列表中的所有内容:
public Single<List<Model>> getData(List<String> identifiers) {
return Observable
.from(identifiers)
.concatMap(identifier -> getDataPerItem(identifier))
.concatMapIterable(it -> it)
.toList();
}
请注意,返回类型为
Single
,因为它只发出一项:包含所有内容的列表。有几种方法可以实现这一点:
一种解决方案是使用concatMapIterable
,然后收集列表中的所有内容:
public Single<List<Model>> getData(List<String> identifiers) {
return Observable
.from(identifiers)
.concatMap(identifier -> getDataPerItem(identifier))
.concatMapIterable(it -> it)
.toList();
}
请注意,返回类型为
Single
,因为它只发出一个项目:包含所有内容的列表。查看reduce
:从空列表开始,然后addAll
从每个部分响应中选择项目。但是如果你被卡住了,请随时更新你的问题!另外,我认为getDataPerItem
应该只执行一个请求。需要做一些工作的是getData
中的Rx链:Observable.from(identifiers).concatMap{identifier->getDataPerItem(identifier)}.reduce(…)
看看reduce
:从一个空列表开始,然后addAll
每个部分响应中的项。但是如果你被卡住了,请随时更新你的问题!另外,我认为getDataPerItem
应该只执行一个请求。需要做一些工作的是getData
中的Rx链:Observable.from(identifiers).concatMap{identifier->getDataPerItem(identifier)}.reduce(…)