подписавшись на наблюдаемое в цепочке и установив наблюдателя на наблюдаемое - PullRequest
0 голосов
/ 30 августа 2018
kotlin 1.2.60
rxJava 2

У меня есть следующий фрагмент кода ниже. Мне интересно, в чем разница в использовании подписки, прикованной к концу плоской карты, печати результатов или создании наблюдателя и подписке на Observable.

По какой-то причине я ожидал получить такие же результаты. Но когда я распечатываю результат в onNext, он отображает полный испущенный элемент.

Тем не менее, для подписки с цепочкой он отображает то, что я ожидал.

fun main(args: Array<String>) {
    val source2 = Observable.just("521934/2342/FOXTROT", "21962/12112/78886/TANGO", "283242/4542/WHISKEY/2348562")

    source2.flatMap {
        Observable.fromArray(*it.split("/").toTypedArray())
    }
    .subscribe { println(it) }

    val observer = object : Observer<String> {
        override fun onComplete() {
        }

        override fun onSubscribe(d: Disposable) {
        }

        override fun onNext(t: String) {
            println(t)
        }

        override fun onError(e: Throwable) {
        }
    }

    source2.subscribe(observer)
}

Вывод ниже: из цепочки подписывайтесь:

521934
2342
FOXTROT
21962
12112
78886
TANGO
283242
4542
WHISKEY
2348562

от следующего:

521934/2342/FOXTROT
21962/12112/78886/TANGO
283242/4542/WHISKEY/2348562

1 Ответ

0 голосов
/ 30 августа 2018

source2 - это неизменяемая коллекция. Вы наблюдаете это дважды. Вы должны зафиксировать результат плоской карты в новой переменной, а затем наблюдать это.

fun main(args: Array<String>) {
    val source2 = Observable.just("521934/2342/FOXTROT", "21962/12112/78886/TANGO", "283242/4542/WHISKEY/2348562")

    val source3 = source2.flatMap {
        Observable.fromArray(*it.split("/").toTypedArray())
    }
    source3.subscribe { println(it) }

    val observer = object : Observer<String> {
        override fun onComplete() {
        }

        override fun onSubscribe(d: Disposable) {
        }

        override fun onNext(t: String) {
            println(t)
        }

        override fun onError(e: Throwable) {
        }
    }

    source3.subscribe(observer)
}
...