그룹핑

하나의 Observable을 여러개의 옵저버로 패턴에 맞게 분리하는 방법에 대해서 알아보자.

+

4개의 문자 배열이 있다.

+

"Alpha" , "Beta" , "Delat" , "Epsilon"

이걸 문자 길이에 맞게끔 분리를 해보자.

+

val source = Observable.just("Alpha" , "Beta" , "Delat" , "Epsilon")

val lengthGroupObservable = source.groupBy { it.length } //groupBy 가 중요함

lengthGroupObservable.flatMapSingle { it.toList() }
        .subscribeBy(
                onNext = {
                    println(it)
                }
        )
======================
[Beta]
[Alpha, Delat]
[Epsilon]

보는 것과 같이 문자열 수에 따라 나뉘어 진다.

+

반환형태는 GroupedObservable으로 나온다.

+

그리고 정렬시 키값을 가져올 수 있다.

+

여기서 말하는 키값은 length 가 될것이다.

+

val source = Observable.just("Alpha" , "Beta" , "Delat" , "Epsilon" , "Te")

val lengthGroupObservable = source.groupBy { it.length }

lengthGroupObservable.flatMapSingle {grp ->
    grp.reduce("" , { x,y ->
        if(x.isEmpty()){
            y
        }else{
            "$x,$y"
        }
    }).map {
       "${grp.key} : $it"
    }
}
.subscribeBy(
        onNext = {
            println(it)
        }
)
===================================
2 : Te
4 : Beta
5 : Alpha,Delat
7 : Epsilon

혹시 reduce관련 해서 기억이 안날수 있으니 다시 설명하자면

+

발행한 데이터를 모두 사용하여 어떤 최종적인 결과 데이터를 합성할 때 활용가능하다.

+

즉 보통 Observable에 입력된 데이터를 필요한 map으로 매핑하고 , 원하는 데이터만 추출할 때 는 불필요한 데이터를 걸러내는 filter() 함수를 호출한다. 또는 상황에 따라 발행된 데이터를 취합하여 어떤 결과를 만들어낼 때는 reduce 계열의 함수를 사용한다.

+

val sources = listOf("1","2","3")
Observable.fromIterable(sources).reduce{ value1 , value2 ->
    "$value2  ( $value1 )"
}.subscribe( ::println )

============================
3  ( 2  ( 1 ) )


+ Recent posts