我有一个Observables列表(RxJava 1)。
List<Observable> observableList = new ArrayList<>();
它可以包含至少1个Observable。每个都有相同类型的结果。
如何压缩所有Observables的结果?
我想到了zip-operator但它不支持List,我不知道可观察量的数量(可以是1,2,3,4 ......)
答案 0 :(得分:15)
您可以使用静态zip(java.lang.Iterable<? extends Observable<?>> ws,FuncN<? extends R> zipFunction)
method。
zip
方法采用Iterable
个Observable
和FuncN
(call
参数Object
})并使用它将相应的发出Observable
组合到结果中,以便新返回的Observable.zip(observableList, new FuncN(){
public ReturnType call(java.lang.Object... args){
ReturnType result; //to be made
//preparatory code for using the args
for (Object obj : args){
ReturnType retObj = (ReturnType)obj;
//code to use the arg once at a time to combine N of them into one.
}
return result;
}
});
省略。
例如,您可以这样做:
not (...)
答案 1 :(得分:4)
ReactiveX-Zip运算符
超越BiFunction的邮政编码
Zip将多个Observable的排放量通过 指定的功能并根据以下内容为每个组合发出单个项目 该功能的结果
在这里,列表是要传递的任何类型的Observable的数组列表。
val list = arrayListOf<Observable<ImageUrlResponse>>()
Observable.zip(list) { args -> Arrays.asList(args) }
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({
val response = it[0]
val imageUrlResponse = imageUrlObject as ImageUrlResponse
urls.add(imageUrlResponse.imageUrl)}
}, {
val c = it
})
以下订阅的结果如下图所示。就像我们希望将其压缩在一起一样。您还可以注意到,它在一个 java.lang.Object [] 中返回了所有要压缩的响应。
请注意,我必须键入强制转换数组列表才能访问我的单个对象,因为它的类型为Any!
答案 2 :(得分:1)
我也为此而苦苦挣扎,并使用Sharan的解决方案作为我的基础。
我的用例是对多个第三方提供程序进行API调用,然后将每个结果放入一个列表中。列表中的每个项目都包含API返回的内容,无论是成功还是失败。
最后,它看起来确实很优雅。在我的特定情况下,“ ResultType”被替换为“ ApiGenericResponseObject”。
Observable.zip(listOfObservables, args -> {
List<ResultType> result = new ArrayList<>();
for (Object o: args) {
ResultType c = (ResultType) o;
// additional code here, I am just concatenating them together
// This gives me a list with the individual result of each Observable (for instance an API call)
result.add(c);
}
return result;
});
或者,作为Lambda,它看起来更整洁。虽然我想知道是否有人会读懂这是怎么回事:
Observable.zip(listOfObservables, args -> Arrays.stream(args)
.map(object -> (ResultType) object)
.collect(Collectors.toList())
);
希望有帮助!
答案 3 :(得分:0)
您可以.stream
ping .reduce
和List
.zip
{1>}:
final Observable<YourType> result = observableList.stream()
.reduce((observable1, observable2) ->
Observable.zip(observable1, observable2, YourTypeCombiner::methodToCombineTwoObjectsOfYourType))
.orElse(Observable.just(defaultValueForYourType));
例如结果将发出new Integer(10)
final List<Observable<Integer>> observableList = ImmutableList.of(
Observable.just(1), Observable.just(2), Observable.just(3), Observable.just(4));
final Observable<Integer> result = observableList.stream()
.reduce((num1, observable2) ->
Observable.zip(observable1, observable2, Integer::sum))
.orElse(Observable.just(0));
不包括错误处理。