rxjava:发出所有可观察量的一个结果而不是多个

时间:2017-11-21 10:45:43

标签: java rx-java

情况是我的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;
}

1 个答案:

答案 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,因为它只会发出一个项目:包含所有内容的列表。