Загадочное поведение 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}") }
→ Ссылка