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}