Я пробовал простой код с операторами fromIterable
и flatMap
.Я просто отображаю поток длинных значений в поток Result
в моем коде.Ничего другого
Вот мой код.У меня есть пустой класс
class Result {
@Override
public String toString() {
return "result";
}
}
И функция
public Observable<Result> getResults(List<Long> requests) {
return Observable.fromIterable(requests)
.flatMap( aLong -> {
Result[] items = {new Result(), new Result()};
return Observable.fromIterable(Arrays.asList(items));
});
}
И я подписываюсь на это следующим образом
List<Long> ids = new ArrayList<>(Arrays.asList(1L, 2L, 3L));
getResults(ids)
.subscribe(new DisposableObserver<Result>() {
@Override
public void onNext(Result item) {
Log.d(TAG, "onNext: " + item);
}
@Override
public void onComplete() {
Log.d(TAG, "onCompleted: ");
}
@Override
public void onError(Throwable e) {
Log.e(TAG, "onError: " + e.getMessage());
}
});
Мой ожидаемый результат -
LOG: onNext: result
LOG: onNext: result
LOG: onNext: result
LOG: onNext: result
LOG: onNext: result
LOG: onNext: result
LOG: onCompleted:
Для каждого выброса fromIterable
ожидается, что flatMap
вернет поток с 2 значениями, итого всего 6 раз onNext
, а затем onComplete
Но что я получаюis
LOG: onNext: result
LOG: onNext: result
LOG: onCompleted:
Только 2 раза срабатывает onNext, а затем завершается.Куда делись оставшиеся 4 значения?
Но странно то, что я добавил Log
к doOnNext
из fromIterable
в моей getResults
функции следующим образом
public Observable<Result> getResults(List<Long> requests) {
return Observable.fromIterable(requests)
.doOnNext(i -> Log.d(TAG, "fromIterable emitted " + i))
.flatMap(aLong -> {
Result[] items = {new Result(), new Result()};
return Observable.fromIterable(Arrays.asList(items));
});
}
Теперь он излучает все значения !!!!Вот вывод
LOG: fromIterable emitted 1
LOG: onNext: result
LOG: onNext: result
LOG: fromIterable emitted 2
LOG: onNext: result
LOG: onNext: result
LOG: fromIterable emitted 3
LOG: onNext: result
LOG: onNext: result
LOG: onCompleted:
Что здесь происходит?Какое изменение onNext
внесло в цепочку для генерации всех значений?