본문 바로가기

gyub's 공부일기/RxJava

[RxJava] filter(), reduce()

1. filter()

filter() 함수는 말 그대로 Observable에서 원하는 데이터만 걸러내는 함수입니다!

위의 그림처럼 filter()는 O만 통과를 하죠!! 비교적 간단한 함수라 바로 코드로 넘어가볼게요

 

val data = intArrayOf(1,2,3,4)
val source = Observable.fromArray(data)
.filter(number-> number % 2 ==0)
source.subscribe(System.out::println)

//result
//2
//4

filter함수에 짝수만 걸러내는 로직을 구성했어요 ! 그랬더니 2,4 즉 짝수만 걸러져 나오는 것을 볼 수 있습니당

 

filter함수는 여기서....끝인데 너무 짧으니 비슷한 함수 몇개를 간단하게 알아볼게연

 

- first(default): Observable의 첫 번째 값을 필터링. 만약 값없이 완료되면 대신 기본값을 리턴

- last(default): Observable의 마지막 값을 필터링. 만약 값없이 완료되면 대신 기본값을 리턴

- take(N): 최초 N개의 값만 가져옴

- takeLast(N): 마지막 N개 값만 가져옴

- skip(N): 최초 N개 값을 건너뜀

- skipLast(N): 마지막 N개 값을 건너뜀

 

다들 함수명을 직관적으로 해석한것과 기능이 비슷하죠 ㅎㅎㅎ 이런게 공부할 때 좋더라구여

 

2. reduce()

reduce() 함수는 발행한 데이터를 모두 사용하여 어떤 최종 결과 데이터를 합성할 때 활용합니다!

 

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

 

그림 자체는 다소 쉬워보이지만 실무에서 적용한다면????

헷갈려요 ㅠ 제가 그랬어요 그래서 복습 겸 코드로 다시 볼게여

(계산 문제 등에서 활용한다고 생각하시면 됩니다)

val balls = arrayOf("1","2","3")
Maybe<String> source = Observable.fromArray(balls)
.reduce((ball1, ball2) -> "$ball2($ball1)")
source.subscribe(System.out::println)

//result
// 5(3(1))

위 그림을 비슷하게 코딩해놓은건데요 

아직도 이해가 안 가실 수 있어욥 or 괄호 보기 귀찮다!

이럴수도 있기에 계산 문제로 들어가볼게요!! 하는 김에 map과 filter도 함께 응용해보도록 하죠

 

 val sales = ArrayList<Pair<String,Int>>();
        sales.add(Pair("TV", 2500));
        sales.add(Pair("CAMERA", 300));
        sales.add(Pair("TV", 1600));
        sales.add(Pair("PHONE", 800));

         val tvSales:Maybe<Integer> = Observable.fromIterable(sales)
                .filter(sale -> sale.first() == "TV")
                .map(it -> it.second())
                .reduce((sale1, sale2) -> sale1 + sale2);
        tvSales.subscribe(result -> System.out.println(result));
        
        //result
        // 4100

tv, camera, phone을 판매하는 가게에서 TV 카테고리의 매출액을 계산하는 프로그램을 짠다고 생각해보면 될 것 같아요!

먼저 filter()로 TV 카테고리의 데이터만 거르고 다룰 데이터들을 map()으로 필터링 된 상품의 가격으로 매핑하고 그 데이터들을 reduce()로 모두 합해버렸습니다!

이제 감이 오시죠 ㅎ,,

 

 

반응형