Почему Observable.fromIterable пропускает некоторые данные в некоторых случаях? - PullRequest
0 голосов
/ 16 ноября 2018

Я пишу пример для проверки оператора 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 пропускает некоторые данные в некоторых случаях?

...