태임쓰의 개발블로그

[RxJava2] #3. 리액티브 연산자 - 기초 (map, filter, reduce) 본문

Rx/RxJava

[RxJava2] #3. 리액티브 연산자 - 기초 (map, filter, reduce)

태임태임 2018. 9. 8. 23:51

3. 리액티브 연산자 - 기초

3.1 리액티브 연산자 특징

  • 다양한 연산자 함수가 존재

    • 하지만, 모두 알아야 리액티브 프로그래밍을 할 수 있는건 아니다

      • 필수 연산자의 개념을 알면 나머지는 필수 연산자에서 파생된 연사자이므로 이해할 수 있기 때문

  • 언어 특성과 크게 연관이 없다.

    • ReactiveX는 자바 뿐만 아니라 자바스크립트, 닷넷, 스칼라, 클로저, 스위프트의 리액티브 연산자 목록 함께 제공

    • RxJava에 익숙해지면 다른 프로그래밍 언어에서도 리액티브 프로그래밍을 쉽게 익힐 수 있음.


3.2 리액티브 연산자의 종류

연산자 종류무엇Ex
생성(Creating) 연산자Observable, Single 클래스 등으로 데이터의 흐름을 만들어 내는 함수create(), just(), fromArray(), interval(), range(), timer() 등
변환(Transforming) 연산자입력을 받아서 원하는 출력을 내는 전통적인 의미의 함수map(), flatmap() 등
필터(Filter) 연산자입력 데이터 중 원하는 데이터만 걸러냄filter(), first(), take() 등
합성(Combining) 연산자여러 Observable 조합
오류처리(Error Handling) 연산자onErrorReturn(), onErrorResumeNext(), retry() 등
유틸리티(Utility) 연산자subscribeOn(), observeOn()
조건(Conditional) 연산자Observable의 흐름을 제어하는 역할
수학과 집합형 연산자수학 함수와 연관있는 연산자
배압(Back pressure) 연산자배압 이슈에 대응하는 연산자
  • 2017년 5월 등록된 연산자 개수: 400개 이상


3.3 map() 함수

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

    • String을 String으로 변환할 수도 있고, String을 Integer나 다른 객체로도 변환할 수 있음

  • .map(ball -> ball + “*”);

    • map 원형 : public final <R> Observable<R> map(Function<? super T, ? extends R> maper)

      • 즉 map 함수 인자 ‘ Function<? super T, ?extends R> mapper’ 에 ‘ball->ball+”*” ‘ 들어간거

      • Function 인터페이스를 이용해 분리

        • Function<String, String> getStar = ball -> ball + “*” ;

        • .map(getStar) // 원래는 .map(ball -> ball + “*”); 이거 였음

  • map() 핵심

    • 내가 원하는 값을 ‘어떤 함수’ 에 넣는 것

      • 어떤 함수 : Function 인터페이스 객체 / 람다 표현식

    • 원하는 함수를 정의할 수 있느냐가 관건






3.4 flatMap() 함수

  • map()을 좀 더 발전시킨 함수

  • 결과가 Observable로 나옴

  • flatMap() => 일대다 or 일대일 Observable 함수

    • map() => 일대일 함수

    • RxJava에서 여러 개의 데이터를 발행하는 방법은 Observable 밖에 없음 (배압(back pressure)을 고려하면 Observable 대신에 Flowable)



3.5 filter() 함수

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

    • 필요없는 데이터는 제거하고 오직 관심 있는 데이터만 filter() 함수를 통과하게 됨.
  • Predicate를 인자로 넣음 (Predicate - 진위 판별이라는 뜻, boolean 값을 리턴하는 특수한 함수형 인터페이스)

    • Map()은 Function 객체를 인자로 넣음
    • 람다를 사용하면 Function인지 Predicate인지 신경쓰지 않고 동일하게 코딩 할 수 있는 장점 (구분은 컴파일러가~)

  • Observable<Integer> source = Observable.fromArray(data).filter(number -> number % 2 ==0 );

  • filter()와 비슷한 함수들

    • first(default) : Observable의 첫 번째 값을 필터. 값이 없이 완료되면 기본값 리턴.
    • last(default) : 마지막 값

    • take(N) : 최초 N 개 값만 가져옴.

    • takeLast(N) : 마지막 N 개 값만 필터함.

    • skip(N) : 최초 N 값을 건너뜀.

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

    • 가장 유용한 함수는 take()



3.6 reduce() 함수

  • 상황에 따라 발행된 데이터를 취합하여 어떤 결과를 만들어낼 때

    • 발행한 데이터를 모두 사용하여 어떤 최종 결과 데이터를 합성할 때
  • Maybe<String> source = Observable.fromArray(balls).reduce((ball1,ball2) -> ball2 + ”(“ + ball1 + “)” );

    • Observable<String> 이 아니라 Maybe<String>
      • Why? : reduce()함수를 호출하면 인자로 넘긴 람다 표현식에 의해 결과 없이 완료될 수도 있음.
      • 따라서 Observable이 아니라 Maybe 객체로 리턴

  • reduce(BiFunction<T,T,T> reducer) => 원형

    • BiFunction 인터페이스를 인자로 활용 (Function X)
      • BiFunction이란? 입력 인자로 2개의 값을 받는 함수형 인터페이스
      • 람다에서 인자의 개수가 2개 이상일 때는, 괄호로 인자의 목록을 명시적으로 표현해줘야 함. Ex) (ball1,ball2) -> ball2 + ”(“ + ball1 + “)”

    • BiFunction<String, String, String> : 인자1, 인자2, 리턴 타입 모두 String






Reference



Comments