Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/194.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
RxJava:如何使用可观察循环代替嵌套循环?_Java_Android_Rx Java_Rx Java3 - Fatal编程技术网

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
    });

}