RxJava の combineLatest のコード例

RxJava の combineLatest、overload がたくさんあって一発で書けた試しがないので、うまく書けた例を置いておきます。

nameage のいずれかの Observable<T> が変化したときに、 "name - 歳:age" な文字列を push するというものです。

val name = PublishSubject.create<String>()
val age = PublishSubject.create<Int>()

// 型引数指定と BiFunction は省略できないみたい
Observable.combineLatest<String, Int, String>(
        name, age, BiFunction { n, a -> "$n - 歳:${a}" })
        .subscribe({
            Log.d("combineLatest", "onNext - ${it}")
        })

// RxKotlin を導入すると型推論が効くとコメントで教えてもらいました
Observables.combineLatest(name, age) { n, a -> "$n - 歳:${a}" }
        .subscribe({
            Log.d("combineLatest", "onNext - ${it}")
        })

// Observable<T> を配列で渡せるけど、第2引数の combiner が Any な配列になっちゃう
Observable.combineLatest(arrayOf(name, age), {
    val n = it[0] as String
    val a = it[1] as Int
    "$n - age:${a}" })
        .subscribe({
            Log.d("combineLatest", "onNext - ${it}")
        })


name.onNext("saito")
age.onNext(24)
name.onNext("yoshida")