switchmap 의 rxjava doc 정의는 다소 모호하며 flatmap 과 동일한 페이지에 링크됩니다 . 두 연산자의 차이점은 무엇입니까?
switchmap 의 rxjava doc 정의는 다소 모호하며 flatmap 과 동일한 페이지에 링크됩니다 . 두 연산자의 차이점은 무엇입니까?
답변:
설명서에 따르면 ( http://reactivex.io/documentation/operators/flatmap.html )
는 switchMap
등이다 flatMap
, 그러나 새로운 이벤트가 소스 관찰에서 방출 될 때까지 그것은 단지 새로운 관찰에서 항목을 방출합니다.
대리석 다이어그램이 잘 보여줍니다. 다이어그램의 차이점을 확인하십시오.
에서는 switchMap
제 원래 발광 ( 녹색 대리석 ) 번째 발광하지 않는 매핑 발광 ( 녹색 정사각형을 제 사람), 본래 발광 ( 청색 대리석 ) 및 이미 시작된 최초 출사있다 매핑 발광 ( 청색 다이아몬드 ). 다시 말해, 두 개의 매핑 된 녹색 배출 중 첫 번째 만이 발생합니다. 파란색 다이아몬드가 이길 때 녹색 사각형이 방출되지 않습니다.
에서 flatMap
"매끄럽지 않은"경우에도 모든 매핑 된 결과가 출력됩니다. 다시 말해, 매핑 된 녹색 방출 의 첫 번째 와 두 번째가 모두 발생합니다.- 녹색 사각형 이 방출되었을 것입니다 (일관된 맵 기능을 사용하는 경우; 그렇지 않은 경우 두 번째 녹색 다이아몬드가 방출 된 후에도 방출 됨) 최초의 블루 다이아몬드)
flatMap
.map(func).switch
하지만 .switchMap(func)
.
"즉석 검색"을 구현할 때 (예 : 사용자가 텍스트 상자에 입력 할 때) 각 키 입력시 거의 실시간으로 결과가 표시됩니다. 해결책은 다음과 같습니다.
flatMap을 사용하면 검색 응답의 순서가 잘못되어 검색 결과가 오래 될 수 있습니다. 이 문제를 해결하려면 새로운 관측기가 제공되면 이전 관측 가능 항목을 구독 취소 할 수 있으므로 switchMap을 사용해야합니다.
따라서 요약하면 타이밍에 관계없이 모든 결과가 중요 할 때는 flatMap을 사용해야하고 마지막 관찰 가능한 결과의 결과 만있을 때 switchMap을 사용해야합니다.
아니 flatMap 토론은 비교하고 대조없이 완료 switchMap
, concatMap
하고 concatMapEager
.
이러한 모든 방법 Func1
은 스트림을 Observable
s 로 변환 한 다음 방출됩니다. 그 차이는 반환 된 Observable
들이 구독 및 탈퇴 될 때, 그리고 그러한들의 방출이 해당 운영자에 Observable
의해 방출되는지의 여부 ____Map
이다.
flatMap
Observable
가능한 한 많은 방출을 구독 합니다. (이것은 플랫폼에 의존하는 숫자입니다. 예를 들어 안드로이드의 숫자는 적습니다) 주문이 중요하지 않고 최대한 빨리 방출을 원할 때 이것을 사용하십시오.concatMap
첫 번째 Observable
구독을 구독 Observable
하고 이전 구독 이 완료되면 다음 구독 만 구독합니다 . 주문이 중요하고 자원을 절약하려는 경우에 사용하십시오. 가장 좋은 예는 먼저 캐시를 확인하여 네트워크 호출을 연기하는 것입니다. 그는 일반적으로 다음에 할 수 .first()
또는 .takeFirst()
불필요한 일을 방지 할 수 있습니다.
http://blog.danlew.net/2015/06/22/loading-data-from-multiple-sources-with-rxjava/
concatMapEager
거의 동일하게 작동하지만 가능한 한 많은 플랫폼에 가입하지만 이전 Observable
이 완료된 후에 만 방출 됩니다. 수행해야하는 많은 병렬 처리가 있지만 flatMap과 달리 원래 순서를 유지하려는 경우에 적합합니다.
switchMap
마지막 Observable
으로 발생한 구독을 구독하고 이전 Observable
의 모든 구독을 취소 합니다. 검색 제안과 같은 경우에 적합합니다. 일단 사용자가 검색 쿼리를 변경하면 이전 요청은 더 이상 관심 대상이 아니므로 구독이 취소되며 올바르게 작동하는 Api 엔드 포인트는 네트워크 요청을 취소합니다.다른 스레드 Observable
가 아닌을 반환 subscribeOn
하면 위의 모든 메소드가 거의 동일하게 작동 할 수 있습니다. 중첩 된 Observable
스레드가 자체 스레드에서 작동 하도록 허용하면 흥미롭고 유용한 동작이 나타납니다 . 그럼 당신은 병렬 처리에서 혜택을 많이받을 얻을 수 있고, 지능적으로 구독 취소 또는에서 가입하지 Observable
관심을하지 않는 S Subscriber
들
amb
또한 관심이있을 수 있습니다. Observable
s 개가 주어지면 처음 방출하는 것과 동일한 항목을 Observable
방출합니다. 동일한 것을 반환 할 수 있고 성능을 원할 여러 소스가있는 경우 유용 할 수 있습니다. 예를 들어 정렬을 amb
사용하면 병합 정렬을 사용하여 빠른 정렬을 수행하고 더 빠른 것을 사용할 수 있습니다.If you are returning Observables that don't subscribeOn another thread, all of the above methods may behave much the same.
- switchMap vs flatMap
내가 전에 만난 모든 설명은 이 중요한 측면을 놓쳤습니다. 이제 모든 것이 더 명확합니다. 감사합니다.
switchMap는 한 번 불렀다 flatMapLatest RxJS 4.
기본적으로 최신 Observable 의 이벤트를 전달 하고 이전 이벤트의 구독을 취소합니다.
Map, FlatMap, ConcatMap 및 SwitchMap 은 함수가 적용하거나 Observable이 생성 한 데이터를 수정합니다.
맵 은 소스 Observable에서 방출 된 각 항목을 수정하고 수정 된 항목을 방출합니다.
FlatMap, SwitchMap 및 ConcatMap 은 또한 방출 된 각 항목에 함수를 적용하지만 수정 된 항목을 반환하는 대신 데이터를 다시 방출 할 수있는 Observable 자체를 반환합니다.
FlatMap 과 ConcatMap 작업은 거의 동일합니다. 여러 Observable에서 방출 한 항목을 병합하고 단일 Observable을 반환합니다.
예제 코드를 찾고 있다면
/**
* We switch from original item to a new observable just using switchMap.
* It´s a way to replace the Observable instead just the item as map does
* Emitted:Person{name='Pablo', age=0, sex='no_sex'}
*/
@Test
public void testSwitchMap() {
Observable.just(new Person("Pablo", 34, "male"))
.switchMap(person -> Observable.just(new Person("Pablo", 0, "no_sex")))
.subscribe(System.out::println);
}
https://github.com/politrons/reactive에서 더 많은 예제를 볼 수 있습니다.
switchMap
와 flatMap
정확히 같은 작동합니다.
다음은 하나 이상의 101 줄 길이의 예 입니다. 그것은 나를 위해 일을 설명합니다.
말한 것처럼 : 그것은 마지막으로 관찰 할 수있는 것 (당신이 원한다면 가장 느린 것)을 얻고 나머지는 무시합니다.
결과적으로 :
Time | scheduler | state
----------------------------
0 | main | Starting
84 | main | Created
103 | main | Subscribed
118 | Sched-C-0 | Going to emmit: A
119 | Sched-C-1 | Going to emmit: B
119 | Sched-C-0 | Sleep for 1 seconds for A
119 | Sched-C-1 | Sleep for 2 seconds for B
1123 | Sched-C-0 | Emitted (A) in 1000 milliseconds
2122 | Sched-C-1 | Emitted (B) in 2000 milliseconds
2128 | Sched-C-1 | Got B processed
2128 | Sched-C-1 | Completed
A가 무시 된 것을 볼 수 있습니다.