В RxJava операторы map()
и flatMap()
используются для преобразования элементов потока (Observable/Flowable/Single), но делают это принципиально по-разному. Понимание их отличий критически важно для правильной работы с реактивными потоками в Android-разработке.
Observable.just(1, 2, 3)
.map(number -> number * 2) // Умножаем каждый элемент на 2
.subscribe(result -> System.out.println(result));
// Вывод: 2, 4, 6
Observable.just("Hello", "World")
.flatMap(word -> Observable.fromArray(word.split(""))) // Разбиваем слова на буквы
.subscribe(letter -> System.out.println(letter));
// Вывод: H, e, l, l, o, W, o, r, l, d
Характеристика | map() | flatMap() |
---|---|---|
Тип преобразования | 1:1 | 1:N |
Возвращаемый тип | Простой объект | Observable/Flowable |
Асинхронность | Нет | Да |
Порядок элементов | Сохраняется | Может нарушаться |
Использование | Простые синхронные преобразования | Асинхронные операции, запросы к БД/сети |
api.getUserIds()
.map { id -> id.toString() } // Преобразуем Int в String
.subscribe { stringId -> showUser(stringId) }
api.getUserIds()
.flatMap { id -> api.getUserDetails(id) } // Для каждого ID делаем новый запрос
.subscribe { user -> displayUser(user) }
api.getUserIds()
.flatMap({ id ->
api.getUserDetails(id).subscribeOn(Schedulers.io())
}, maxConcurrency = 5) // До 5 параллельных запросов
.subscribe { user -> updateUI(user) }
Ошибки:
map()
бросит ошибку сразуflatMap()
может продолжать обрабатывать другие ObservableBackpressure:
map()
не влияет на backpressureflatMap()
может создавать проблемы с backpressure при большом количестве внутренних ObservableАльтернативы:
concatMap()
- сохраняет порядокswitchMap()
- отменяет предыдущие запросыflatMapSingle()
, flatMapMaybe()
- специализированные версииmap()
- он эффективнееflatMap()
создает дополнительные объекты и может вызывать GCflatMap()
может привести к быстрому обновлению UI map()
используется для простых синхронных преобразований элементов, тогда как flatMap()
позволяет работать с асинхронными операциями и преобразовывать один элемент в множество. Выбор между ними зависит от конкретной задачи и требований к порядку обработки элементов.