Combinelatest

두개의 리스트를 비교하는 걸 구현한다고 가정했을때 여러 가지 방법이 있을테지만

그중에 conbinelatest 를 사용해서 리스트와 각각의 값을 비교하는 방법으로 진행해보자.

다이어그램은 다음과 같다.

val observable1 = Observable.fromArray("A" , "B" , "C" , "D")
    val observable2 = Observable.fromArray("E" , "C" , "B" , "G","F")

    Observables.combineLatest( observable1.toList().toObservable() , observable2 ){ list , value ->
                println("$list <> $value")
                if(list.contains(value)) value else ""
            }
            .filter { !it.isEmpty() }
            .subscribeBy(
                    onNext = {
                        println("value -> $it")
                    }
            )

====================
[A, B, C, D] <> E
[A, B, C, D] <> C
value -> C
[A, B, C, D] <> B
value -> B
[A, B, C, D] <> G
[A, B, C, D] <> F

우선 zip 과 combinelatest 성격은 합쳐주는데 있지만 조합하는 게 좀 다르다.

우선 zip을 보자,

순서대로 묶여서 나오는걸 볼 수 있다.

val observable1= Observable.interval(100 , TimeUnit.MILLISECONDS)
val observable2 = Observable.interval( 250 , TimeUnit.MILLISECONDS)

Observable.zip(observable1 , observable2 , BiFunction{ t1 : Long , t2 : Long ->
    "t1 : $t1 , t2 : $t2"
}).subscribe{
    println("값 -> $it")
}

Thread.sleep(1000)
=======================
값 -> t1 : 0 , t2 : 0
값 -> t1 : 1 , t2 : 1
값 -> t1 : 2 , t2 : 2
값 -> t1 : 3 , t2 : 3

그럼 combinelatest를 보자.

val observable1= Observable.interval(100 , TimeUnit.MILLISECONDS)
val observable2 = Observable.interval( 250 , TimeUnit.MILLISECONDS)

Observable.combineLatest(observable1 , observable2 , BiFunction{ t1 : Long , t2 : Long ->
    "t1 : $t1 , t2 : $t2"
}).subscribe{
    println("값 -> $it")
}

Thread.sleep(1000)
======================
값 -> t1 : 1 , t2 : 0  
값 -> t1 : 2 , t2 : 0 <- 먼저 나온것과 이전 나온것을 묶여서 보여주는 걸 볼 수 있다.
값 -> t1 : 3 , t2 : 0
값 -> t1 : 4 , t2 : 0
값 -> t1 : 4 , t2 : 1
값 -> t1 : 5 , t2 : 1
값 -> t1 : 6 , t2 : 1
값 -> t1 : 6 , t2 : 2
값 -> t1 : 7 , t2 : 2
값 -> t1 : 8 , t2 : 2


+ Recent posts