본문 바로가기

Language/RxJava

[RxJava] 3장. 리액티브 연산자 입문

728x90

생성 연산자

  • 데이터 흐름을 만들어내는 함수
  • create, just, fromArray, interval ...

변환 연산자

  • 어떤 입력을 받아서 원하는 출력 결과를 내는 전통적인 의미의 함수
  • map, flatmap ...

필터 연산자

  • 입력 데이터 중 원하는 데이터만 걸러낸다
  • filter, first, take ...

합성 연산자

  • 여러 Observable을 조합하는 역할

오류처리 연산자

  • onErrorReturn, onErrorResumeNext, retry ...

유틸리티 연산자

  • 비동기 프로그래밍을 지원
  • subscribeOn, observeOn ...

RxJava의 제네릭 함수형 인터페이스

  • Predicate<T> : boolean sample(T t). t 값을 받아서 참이나 거짓을 반환
  • Consumer<T> : void accept(T t). t 값을 받아서 처리. 반환 값은 없다.
  • Function<T, R> : R apply(T t). t 값을 받아서 R 타입 결과를 반환함.

Map() 함수

입력 값을 어떤 함수에 넣어서 원하는 값으로 변환하는 함수.

String to String, String to Integer 등 다른 객체로 변환 가능.

 

String[] sample = {"1", "2", "3"};
Observable<String> source = Observable.fromArray(sample).map(val -> val + "#")
    .subscribe(Log::i);

// 출력 결과
1#
2#
3#

 

flatMap() 함수

map을 발전시킨 함수. map이 일대일 함수라면 flatMap은 일대다 혹은 일대일 Observable 함수.

결과 값이 Observable이기 때문에 결과로 여러 개의 데이터를 발행할 수 있다.

 

// 구구단
int dan = Integer.parseInt(in.nextLine());

Observable<String> source = Observable.just(dan)
    .flatMap(num -> 
        Observable.range(1,9).map(row -> dan * row)
    );
source.subscribe(System.out::println);

 

dan은 사용자에게 입력을 받는 변수이다.

Observable 을 보면, dan을 발생하고 그에 따른 결과 값을 flatMap을 사용하여 발행한다.

flatMap에서는 다시 새로운 Observable을 선언하여 1부터 9까지 범위를 갖는 변수를 발행하고, map을 통해 값을 발행하게 된다.

따라서, 1부터 9까지 범위를 갖는 변수는 row 가 되고, 입력 받은 값 dan과 곱하여 num 을 출력하게 된다.

filter() 함수

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

 

Integer[] number = {1, 2, 3, 4};

Observable<Integer> source;
Single<Integer> single;

// filter 함수를 사용해 짝수 출력
source 
    = Observable.fromArray(number).filter(num -> num % 2 == 0).subscribe(System.out::println);

// 2 4

// first 함수를 사용해 첫 번째 값 출력. 10은 default 값
single = Observable.fromArray(number).first(10).subscribe(System.out::println);

// 1

// last 함수를 사용해 마지막 값 출력. 10은 default 값
single = Observable.fromArray(number).last(10).subscribe(System.out::println);

// 4

// take 함수를 사용해 최초 N 개의 값 출력. 
source = Observable.fromArray(number).take(3).subscribe(System.out::println);

// 1 2 3

// takeLast 함수를 사용해 마지막 N 개의 값 출력. 
source = Observable.fromArray(number).takeLast(3).subscribe(System.out::println);

// 2 3 4

// skip 함수를 사용해 최초 N 개의 값 무시.
source = Observable.fromArray(number).skip(2).subscribe(System.out::println);

// 3 4

// skipLast 함수를 사용해 마지막 N 개의 값 무시.
source = Observable.fromArray(number).skipLast(2).subscribe(System.out::println);

// 1 2

 

reduce() 함수

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

reduce는 Observable이 아닌 Maybe를 사용한다.

 

String[] date = {"1", "2", "3"};

Maybe<String> source = Observable.fromArray(data)
    .reduce((value1, value2) -> value1 + "(" + value2 + ")")
        .subscribe(System.out::println);

// 출력 값
3(2(1)))

 

주로, Map과 filter로 필요한 데이터를 구하고 reduce를 통해 결과 값을 구한다.

 

List<Pair<String,Integer>> data = new ArrayList<>();

data.add(Pair.of("TEST", 100));
data.add(Pair.of("TEXT", 200));
data.add(Pair.of("TEST", 300));
data.add(Pair.of("TEST", 400));


Maybe<String> vat = Observable.fromIterable(data)
    .filter(price -> "TEST".equals(data.getLeft()))
    .map(price -> data.getRight())
    .reduce( (price1, price2) -> price1 + price2 )
    .subscribe(System.out::println);

// data에서 key 값이 TEST인것을 걸러 value 값을 구하고, 그 값들을 더해서 출력한다.
// 출력 값
800
728x90