일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- if kakao 동영상
- if kakao 다음 웹툰의 UX
- RxJava2 정리
- RxJava2 Single
- RxJava 프로그래밍
- OddOccurrencesInArray
- if kakao 세션 영상
- Array 알고리즘
- Android
- 뜨거운 Observable
- if kako 모바일 세션
- RxJava 요약
- if kakao 카카오뱅크 모바일 앱 개발 이야기
- XOR 연산자
- RxJava
- if kakao 2018
- Rxjava2
- 차가운 Observable
- if kakao 다음 모바일 첫 화면 개선기
- if kakao 카카오톡의 서버사이드 코틀린
- 카카오 개발자 컨퍼런스 후기
- 리액티브 프로그래밍
- 카카오 개발자 컨퍼런스
- if kakao 후기
- RxJava 스케줄러
- subscribeOn
- XOR 비트연산자
- if kakao 안드로이드
- onserveOn
- 코딜리티
태임쓰의 개발블로그
[RxJava2] #3. 리액티브 연산자 - 기초 (map, filter, reduce) 본문
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
'Rx > RxJava' 카테고리의 다른 글
[RxJava2] #5. 스케줄러 (0) | 2018.09.09 |
---|---|
[RxJava2] #4. 리액티브 연산자 - 활용 (생성, 변환, 결합, 조건 연산자) (2) | 2018.09.09 |
[RxJava2] #2. Observable (Single, Maybe, 뜨거운/차가운 Observable, 팩토리함수) (1) | 2018.09.08 |
[RxJava2] #1. 리액티브 프로그래밍과 RxJava (0) | 2018.09.08 |