Я пишу пример для проверки оператора flatMap
в RxJava2, ниже приведен фрагмент кода:
Observable<Integer> observable = ObservableCreate.create(new ObservableOnSubscribe<Integer>() {
@Override
public void subscribe(ObservableEmitter<Integer> emitter) throws Exception {
emitter.onNext(1);
emitter.onNext(2);
emitter.onNext(3);
emitter.onNext(4);
emitter.onComplete();
}
});
Disposable disposable = observable.flatMap(new Function<Integer, ObservableSource<String>>() {
@Override
public ObservableSource<String> apply(Integer i) throws Exception {
List<String> list = new ArrayList<>(3);
for(int j = 0; j < 3; j++) {
list.add("I am from apply:" + i);
//list.add("I am from apply:" + i + "_" + j);
}
log("apply: " + listToString(list));
return Observable.fromIterable(list);
}
})
.flatMap(new Function<String, ObservableSource<String>>() {
@Override
public ObservableSource<String> apply(String s) throws Exception {
return Observable.create(new ObservableOnSubscribe<String>() {
@Override
public void subscribe(ObservableEmitter<String> emitter) throws Exception {
emitter.onNext("flatMap--" + s);
emitter.onComplete();
}
});
}
})
.subscribe(
s -> log("accept: " + s)
, throwable -> log(throwable.getMessage())
, () -> log("complete!")
);
Как вы думаете, какие журналы будут печататься?Будет ли что-то похожее на следующее?
apply: [I am from apply:1, I am from apply:1, I am from apply:1]
accept: flatMap--I am from apply:1
accept: flatMap--I am from apply:1
accept: flatMap--I am from apply:1
apply: [I am from apply:2, I am from apply:2, I am from apply:2]
accept: flatMap--I am from apply:2
accept: flatMap--I am from apply:2
accept: flatMap--I am from apply:2
apply: [I am from apply:3, I am from apply:3, I am from apply:3]
accept: flatMap--I am from apply:3
accept: flatMap--I am from apply:3
accept: flatMap--I am from apply:3
apply: [I am from apply:4, I am from apply:4, I am from apply:4]
accept: flatMap--I am from apply:4
accept: flatMap--I am from apply:4
accept: flatMap--I am from apply:4
complete!
Я также думаю, что я получу эти журналы, но я ошибаюсь, я получаю только два для каждой строки, просто так:
apply: [I am from apply:1, I am from apply:1, I am from apply:1]
accept: flatMap--I am from apply:1
accept: flatMap--I am from apply:1
apply: [I am from apply:2, I am from apply:2, I am from apply:2]
accept: flatMap--I am from apply:2
accept: flatMap--I am from apply:2
apply: [I am from apply:3, I am from apply:3, I am from apply:3]
accept: flatMap--I am from apply:3
accept: flatMap--I am from apply:3
apply: [I am from apply:4, I am from apply:4, I am from apply:4]
accept: flatMap--I am from apply:4
accept: flatMap--I am from apply:4
complete!
Я пытаюсь найти причину этого, поэтому я добавляю несколько точек останова и шаг отладки, к сожалению, после отладки я получаю правильный результат.Я так растерялся, оператор fromIterable
пропускает некоторые данные в некоторых случаях?