RxJava:如何使用可观察循环代替嵌套循环?
现在,我将嵌套循环与RxJava:如何使用可观察循环代替嵌套循环?,java,android,rx-java,rx-java3,Java,Android,Rx Java,Rx Java3,现在,我将嵌套循环与ReplaySubject一起使用,以获得多个观察值,这需要在不使用任何循环的情况下进行转换,而只使用观察值 private Observable<BaseUnit> getUnitObservables(ArrayList<Map<Integer, Integer>> list, ReplaySubject<BaseUnit> subject) { ArrayList<Observable<BaseUni
ReplaySubject
一起使用,以获得多个观察值,这需要在不使用任何循环的情况下进行转换,而只使用观察值
private Observable<BaseUnit> getUnitObservables(ArrayList<Map<Integer, Integer>> list, ReplaySubject<BaseUnit> subject) {
ArrayList<Observable<BaseUnit>> observables = new ArrayList<>();
for (Map<Integer, Integer> elem : list) {
for (MapOperationName operationName : MapOperationName.values()) { // MapOperationName type is enum
Observable<BaseUnit> observable = Observable.fromCallable(() -> {
// some operations here
subject.onNext(unit);
observables.add(observable);
});
}
}
return Observable.merge(observables);
}
如何正确组合此
ArrayList
和Enum
以获得完整的对组合集?您可以将需要执行的操作嵌套在flatMap
中以实现此目的:
private Observable getUnitObservables(ArrayList列表,ReplaySubject主题){
可观察操作=
Observable.fromArray(MapOperationName.values());
可观测的可观测列表=可观测的。可观测的(列表);
返回观察者
.flatMap(列表->观察操作
.map(操作元素->{
//这里有些行动
主题:下一个(单位);
返回单位;//假设单位是基本单位
})
);
}
我真的不喜欢将ReplaySubject
传递给您的方法。相反,您可以将您的方法作为源,并让您的主题订阅它:
私有可观察getUnitObservables(ArrayList列表){
返回可观察的。来自可观察的(列表)
.flatMap(listElem->Observable.fromArray(MapOperationName.values())
.map(操作元素->{
//这里有些行动
返回新的BaseUnit();
})
);
}
...
...
Subject-Subject=ReplaySubject.create();
主题
.mergeWith(getUnitObservables(listParam))
.subscribe();
谢谢,没错。但有一件事让我困惑:“subject.mergeWith()”需要什么?这难道不是多余的吗?在你的代码中,你返回了一个可观察的对象,并且对另一个主题调用了“onnext”,对吗?我删除了方法中的“onnext”,并将其替换为“mergewith”
private Observable<BaseUnit> getUnitObservables(ArrayList<Map<Integer, Integer>> list, ReplaySubject<BaseUnit> subject) {
Observable<ListOperationName> observableOperation =
Observable.fromArray(MapOperationName.values());
Observable<List<Integer>> observableList = Observable.fromIterable(list);
return Observable.zip(observableList, observableOperation, (listElem, operationElem) -> {
subject.onNext(unit);
//some operations here
});
}