Загадочное поведение Flowable с flatMap
Не могу понять, почему, в случае, если я вызываю метод showcaseFlatMap со следующим кодом :
fun showcaseFlatMap() {
val colors: Flowable<String> = Flowable.just("orange", "red", "green")
.flatMap<String> { colorName -> simulateRemoteOperation(colorName) }
colors.subscribe { value -> println("Subscriber received: {$value}") }
}
fun simulateRemoteOperation(color: String): Flowable<String> {
return Flowable.intervalRange(1, color.length.toLong(), 0, 200, TimeUnit.MILLISECONDS)
.map { iteration -> color + iteration }
}
получаю следующий результат:
Subscriber received: {orange1}
Subscriber received: {red1}
Subscriber received: {green1}
Subscriber received: {orange2}
Subscriber received: {red2}
Subscriber received: {green2}
Subscriber received: {orange3}
Subscriber received: {red3}
Subscriber received: {green3}
Subscriber received: {orange4}
Subscriber received: {green4}
Subscriber received: {orange5}
Subscriber received: {green5}
Subscriber received: {orange6}
однако, если я меняю в этом методе код:
val colors: Flowable<String> = Flowable.just("orange", "red", "green")
.flatMap<String> { colorName -> simulateRemoteOperation(colorName) }
на код:
val colors: Flowable<String> = Flowable.just("orange", "red", "green")
colors.flatMap<String> { colorName -> simulateRemoteOperation(colorName) }
то результат уже совсем другой:
Subscriber received: {orange}
Subscriber received: {red}
Subscriber received: {green}
В чём причина такого изменения результата? Я ожидала, что вывод не изменится.
Ответы (1 шт):
Автор решения: IR42
→ Ссылка
Потому что flatMap да и вообще все операторы возвращают новый объект (Flowable в данном случае), который вы игнорируете, а не изменяют состояние текущего. И получается, что подписываетесь вы лишь на Flowable.just("orange", "red", "green")
val colors: Flowable<String> = Flowable.just("orange", "red", "green")
val colorsMapped = colors.flatMap<String> { colorName -> simulateRemoteOperation(colorName) }
colorsMapped.subscribe { value -> println("Subscriber received: {$value}") }