본문 바로가기
2023년 이전/ReativeX

RxJava,RxKotlin - groupBy 함수

by JeongUPark 2020. 1. 14.
반응형

[출처 - RxJava 프로그래밍 : 리액티브 프로그래밍 기초부터 안드로이드 까지 한번에]

본 글은 'RxJava 프로그래밍 : 리액티브 프로그래밍 기초부터 안드로이드 까지 한번에' 를 학습하면서 정리한 글입니다

 

마블다이어그램 참고 - http://reactivex.io/RxJava/javadoc/io/reactivex/Flowable.html#groupBy-io.reactivex.functions.Function-

 

 

groupBy 함수는 어떤 기준으로 단일 Observable을 여러 개로 이루어진 Observable 그룹으로 만드는 함수 입니다.

 

마블다이어그램을 보는것이 이해가 빠릅니다.

groupBy 함술르 통하여 동그라미 그룹과 역삼각형 그룹으로 정리됩니다.

 

test code를 보겠습니다.

 

Java

import io.reactivex.Observable;
import io.reactivex.observables.GroupedObservable;

public class GroupBy_Test {

    public static void main(String args[]){

        String[] objs = {"6","4","2-T","2","6-T","4-T"};

        Observable<GroupedObservable<String,String>> source = Observable.fromArray(objs).groupBy(it->getShape(it));

        source.subscribe(obj->{
            obj.subscribe(val->System.out.println("GROUP:"+obj.getKey()+"\t value:"+val));
        });
    }

    private static String getShape(String obj){
        if(obj.equals("")){
            return "NO-SHAPE";
        }
        if(obj.contains("-T")){
            return "TRIANGLE";
        }
        return "BALL";
    }
}

 

kotlin

import io.reactivex.rxkotlin.toObservable

fun main(){
    val objs = arrayOf("6", "4", "2-T", "2", "6-T", "4-T")
    var source = objs.toObservable().groupBy {it-> getShape(it)}

    source.subscribe{obj->
        obj.subscribe { value -> println("GROUP: ${obj.getKey()} value:+$value") }
    }

}

private fun getShape(obj: String): String {
    if (obj == "") {
        return "NO-SHAPE"
    }
    return if (obj.contains("-T")) {
        "TRIANGLE"
    } else "BALL"
}

결과

GROUP: BALL value: 6
GROUP: BALL value: 4
GROUP: TRIANGLE value: 2-T
GROUP: BALL value: 2
GROUP: TRIANGLE value: 6-T
GROUP: TRIANGLE value: 4-T

 

groupBy를 쓸 경우 그 항목에 대한 key 값을 구분할 수 있고 그걸로 group화 할 수 있습니다. 만약 특정 그룹만 처리하고 싶다면 filter에 key값을 통하여

 

import io.reactivex.rxkotlin.toObservable

fun main(){
    val objs = arrayOf("6", "4", "2-T", "2", "6-T", "4-T")
    var source = objs.toObservable().groupBy {it-> getShape(it)}

    source.subscribe{obj->
        obj.filter {it->obj.key.equals("BALL")}
            .subscribe { value -> println("GROUP: ${obj.getKey()} value: $value") }
    }

}

private fun getShape(obj: String): String {
    if (obj == "") {
        return "NO-SHAPE"
    }
    return if (obj.contains("-T")) {
        "TRIANGLE"
    } else "BALL"
}

결과

GROUP: BALL value: 6
GROUP: BALL value: 4
GROUP: BALL value: 2

처럼 처리할 수 있습니다.

반응형

'2023년 이전 > ReativeX' 카테고리의 다른 글

RxJava, RxKotlin - zip 함수  (0) 2020.01.16
RxJava, RxKotlin - Scan 함수  (1) 2020.01.15
RxJava,RxKotlin - switchMap  (0) 2020.01.14
RxJava, RxKotlin - concatMap  (0) 2020.01.14
RxJava, RxKotlin - repeat()  (0) 2019.12.16