RxJava기록 - 리액티브 연산자 (2)

dada·2022년 1월 6일
0

RxJava

목록 보기
10/12

1. filter() 함수

  • Observable에서 원하는 데이터만 걸러내는 역할

 String[] objs = {"1 CIRCLE", "2 DIAMOND", "3 TRIANGLE", "4 DIAMOND", 
 "5 CIRCLE", "6 HEXAGON"};
 Observable<String> source = Observable.fromArray(objs)
 	.filter(obj -> obj.endsWith("CIRCLE));
 source.subscribe(System.out::println);
 
 //출력값
 1 CIRCLE
 2 CIRCLE

👉🏻 CIRCLE로 끝나는 값만 출력

🐥filter() 함수와 비슷한 함수들

  • first(default) 함수 : Observable의 첫 번째 값을 필터, 만약 값 없이 완료되면 기본값 리턴
  • last(default) 함수 : Observable의 마지막 값을 필터, 만약 값 없이 완료되면 기본값 리턴
  • take(N) 함수 : 최초 N개 값만 가져옴
  • takeLast(N) 함수 : 마지막 N개 값만 필터함
  • skip(N) 함수 : 최초 N개 값을 건너뜀
  • skipLast(N) 함수 : 마지막 N개 값을 건너뜀

reduce() 함수

  • 발행한 데이터를 모두 사용하여 어떤 최종 결과 데이터를 합성할 때 활용

String[] balls = {"red", "green", "blue"}
Maybe<String> source = Observable.fromArray(balls)
	.reduce((ball1, ball2) -> ball2 + "(" + ball1 + ")";
source.subscribe(System.out::println);

//결과값
blue(green(red))
  • reduce() 함수를 호출하면 인자로 넘긴 람다 표현식에 의해 결과 없이 완료 될 수 있어 Maybe 객체로 리턴

ex) 데이터 쿼리하기

  1. 전체 매출 데이터를 입력
  2. 매출 데이터 중 TV 매출을 필터링
  3. TV 매출의 합을 구함
List<Pair<String,Integer>> sales = new ArrayList<>();

sales.add(Pair.of("TV", 2500));
sales.add(Pair.of("Camera", 300));
sales.add(Pair.of("TV", 1600));
sales.add(Pair.of("Phone", 800)));

Maybe<Integer> tvSales = Observable.fromIterable(sales)
	.filter(sale -> "TV".equals(sale.getLeft()))
	.map(sale -> sale.getRight())
	.reduce((sale1, sale2) -> sale1 + sale2);
tvSales.subscribe(tot -> System.out.println("TV Sales: $" + tot));

👉🏻 reduce()를 사용하기 위해 Maybe로 선언

👉🏻filter()를 이용하여 TV 목록을 조회하고 map()을 이용해 값을 가져오고 reduce()를 통해 합계를 구함

*getLeft()와 getRight()는 pair 클래스에서 왼쪽값과 오른쪽 값을 얻어오기 위해 호출

profile
기록하기

0개의 댓글