Client/안드로이드

Transforming Observables

이건욱 2020. 5. 29. 10:57

Buffer

매개변수에 주어진 값만큼 데이터를 모아두었다가 발행을 합니다.

Observable.just(1,2,3,4,5)
  .buffer(3)
  .subscribeBy {
  	println(it)
  }
  
[1, 2, 3]
[4, 5]

FlatMap

FlatMap을 통해서 어떠한 입력 값을 받아서 Observable로 변환을 합니다.

 

Observable.just(1,2,3,4,5)
            .flatMap {
                Observable.just(it).map { data -> data + 1 }
            }
            .subscribeBy {
                println(it)
            }

2
3
4
5
6

GroupBy

어떤 기준으로 여러 개로 이루어진 Observable 그룹을 생성합니다.

 

val array = listOf(1, 1, 2, 2, 3, 3)
        Observable.fromIterable(array)
            .groupBy {
                if (it == 1) {
                    return@groupBy "one"
                }else {
                    "two"
                }
            }
            .subscribeBy { obj ->
                obj.subscribeBy {
                    println("GROUP: ${obj.key} value:+$it")

            }
        }
        
GROUP: one value:+1
GROUP: one value:+1
GROUP: two value:+2
GROUP: two value:+2
GROUP: two value:+3
GROUP: two value:+3

 

Map

인자로 전달받은 데이터에 변형을 한뒤에 새로운 값을 반환합니다.

 

val array = listOf(1, 1, 2, 2, 3, 3)
        Observable.fromIterable(array)
            .map { it * 2 }
            .subscribeBy { obj ->
              println(obj)
            }
        }
2
2
4
4
6
6

Scan

scan을 통해서 순차적으로 계속해서 누적해서 onNext 전달을 진행을 합니다.

 

val array = listOf(1, 2, 3)
        Observable.fromIterable(array)
            .scan { t1: Int, t2: Int ->
                println("########## t1 ##########")

                println(t1)
                println("########## t2 ##########")

                println(t2)

                t1 + t2
            }
            .subscribeBy { obj ->
                println("########## subscribe ##########")
                println(obj)
            }
        }
        
########## subscribe ##########
1
########## t1 ##########
1
########## t2 ##########
2
########## subscribe ##########
3
########## t1 ##########
3
########## t2 ##########
3
########## subscribe ##########
6

예제를 통해 봤을 때 t1에서는 누적된 값 , t2에서는 original event 인것을 알수가 있습니다.

 

Window

window는 어떻게 보면 buffer와 비슷합니다. 하지만 다른점은 Observable을 통해서 return을 시킨다는 점이 다릅니다.

val array = listOf(1, 2, 3,4,5,6,7,8,9)
        Observable.fromIterable(array)
            .window(3)
            .subscribeBy { obj ->
                obj.toList().subscribeBy {
                    println(it)
                }
            }
            
[1, 2, 3]
[4, 5, 6]
[7, 8, 9]

val array = listOf(1, 2, 3,4,5,6,7,8,9)
        Observable.fromIterable(array)
            .window(3)
            .subscribeBy { obj ->
                obj.toMap {
                    it
                }.subscribeBy {
                    println(it)
                }
            }
            
{1=1, 2=2, 3=3}
{4=4, 5=5, 6=6}
{7=7, 8=8, 9=9}