情况是我的getData()方法是使用字符串列表的参数调用的。对于每个字符串,我需要在getDataPerItem()中执行一些操作。最后,每次调用getDataPerItem()的结果应该合并到一个大的List中(保持结果的顺序),getData()应该在单个列表中发出所有结果。使用当前方法,它将分别为每个标识符发出一个List。如何将所有结果合并为一个?
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;
}
答案 0 :(得分:2)
有几种方法可以实现这一目标:
一种解决方案是使用concatMapIterable
,然后收集列表中的所有内容:
public Single<List<Model>> getData(List<String> identifiers) {
return Observable
.from(identifiers)
.concatMap(identifier -> getDataPerItem(identifier))
.concatMapIterable(it -> it)
.toList();
}
另一个解决方案是将reduce
改为ArrayList
:
public Single<List<Model>> getData(List<String> identifiers) {
return Observable
.from(identifiers)
.concatMap(identifier -> getDataPerItem(identifier))
.reduce(new ArrayList<Model>(), (list, next) -> list.addAll(next));
}
请注意,返回类型为Single
,因为它只会发出一个项目:包含所有内容的列表。