RxJava를 활용한 리액티브 프로그래밍 정리 Vol.2
-
date_range 07/05/2018 14:30 infosortJavalabelRxJavaReactiveProgramming
3장 연산자와 변환
filter
filter는 정확히 동일한 연산자를 반환함.
Observable<String> strings = ....
Observable<String> filtered = strings.filter(s -> s.startsWith("#"));
map
업스트림에서 흘러오는 개별 이벤트 모두에 대해 변환을 적용
Observable<Instant> instants = tweets.map(Status::getCreatedAt)
.map((Date d) -> d.toInstant());
flatMap
얼핏 보기에는 map과 비슷하지만, 개별 변환한 요소를 다른(중첩된, 내부의) Observable로 반환한다. flatMap을 개별 업스트림 이벤트에 대한 비동기 연산으로 생성하여 분할 실행한 뒤, 결과를 다시 모을 때 사용할 수 있다.
numbers.map(x -> x * 2);
numbers.filter(x -> x != 10);
//같은 구현
numbers.flatMap(x -> just(x * 2));
numbers.flatMap(x -> (x != 10) just(x) : empty());
- 대체로 flatMap을 사용하는 상황
- map의 반환 결과가 Observable이어야 하는 경우
- 단일 이벤트가 여러 하위 이벤트로 확장되는, 일대다 변환이 필요한 경우
- flatMap은 부속 이벤트가 다운스트림 연산자/구독자에게 도달하는 순서를 보장할 수 없다.
merge
여러 이벤트 소스를 하나로 합친다.
Observable<String> all = Observable.merge(
preciseAlgo(photo),
fastAlgo(photo),
experimentalAlgo(photo)
)
zip
스트림 두 개 이상을 합치되, 각각의 서로 대응하는 개별 이벤트끼리 짝을 맞춘다.
Observable<String> all = Observable.merge(
preciseAlgo(photo),
fastAlgo(photo),
experimentalAlgo(photo)
)