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()로 모두 합해버렸습니다!
이제 감이 오시죠 ㅎ,,
'gyub's 공부일기 > RxJava' 카테고리의 다른 글
[RxJava] 변환 연산자 concatMap(), switchMap(), groupBy(), scan() (0) | 2020.10.25 |
---|---|
[RxJava] 생성 연산자 interval(), timer(), range(), intervalRange(), defer() (0) | 2020.10.22 |
[RxJava] map(), flatMap() (0) | 2020.10.16 |
[RxJava] Subject 클래스, ConnectableObservable 클래스 (0) | 2020.10.16 |
[RxJava] Single 클래스, Maybe 클래스, 뜨거운 Observable (0) | 2020.10.16 |