
안녕하세요
이번 시간에는 필터링하는 연산자에 대해 알아보겠습니다.
Observable로부터 발행되는 아이템들을 선택적으로 발행하도록 하는 연산자입니다.
debounce

Observable.create(emitter -> {
emitter.onNext("1");
Thread.sleep(3000); //3초
emitter.onNext("2");
emitter.onNext("3");
emitter.onNext("4");
emitter.onNext("5");
Thread.sleep(3000);
emitter.onNext("6");
})
.debounce(1000, TimeUnit.MILLISECONDS) //1초
.subscribe(System.out::println);
특정 시간 동안 다른 아이템이 발행되지 않을 때만 아이템을 발행하도록 하는 연산자다. 반복적으로 빠르게 발행된 아이템들을 필터링할 때 유용하게 사용할 수 있다.
라고 책에 나와있는데 솔직히 이해가 가지 않습니다.
풀어서 설명하자면 "1"이라는 아이템이 발행되고 1초(debounce(1000))의 시간 동안 새로운 아이템이 발행되지 않는다면 해당 아이템을 발행합니다.
즉 "1" 이라는 아이템이 발행되고 Thread.sleep(3000)을 이용해 3초 동안 아이템 발행을 멈추었습니다.
그래서 1초(debounce(1000))동안 아이템이 발행되지 않았으니 "1"을 앱 시작 후 1초 후에 출력을 한 것입니다.
다음과 같은 결과를 볼 수 있다.
2022-11-09 15:51:25.461 10970-10970/com.psw.rxtest4 W/com.psw.rxtest: Accessing hidden method Landroid/view/ViewGroup;->makeOptionalFitsSystemWindows()V (greylist, reflection, allowed)
2022-11-09 15:51:26.576 10970-11008/com.psw.rxtest4 I/System.out: 1
2022-11-09 15:51:29.579 10970-11008/com.psw.rxtest4 I/System.out: 5
2022-11-09 15:51:32.582 10970-11008/com.psw.rxtest4 I/System.out: 6
앱이 시작된 시각은 15시 51분 25초다
1이 출력된 시각은 15시 51분 26초다
3초 후 5가 출력되고, 또 3초 후 6이 출력된다.
distinct

Observable.just(1,2,1,2,3)
.distinct()
.subscribe(System.out::println);
distinct 연산자는 이미 발행한 아이템을 중복으로 발행하지 않는다.
.distinct()가 없다면 1, 2, 1, 2, 3이 출력되지만 이미 발행한 아이템을 발행하지 않으므로 1, 2, 3이 출력될 것이다.
elementAt

Observable.just(0,1,2,3,4)
.elementAt(2)
.subscribe(System.out::println);
특정 인덱스에 해당하는 아이템을 필터링합니다.
filter

Observable.just(1,2,10,5,13)
.filter(x -> x > 3)
.subscribe(System.out::println);
filter의 조건식이 참일 때만 아이템을 발행합니다.
sample

Observable.interval(1000, TimeUnit.MILLISECONDS)
.sample(3, TimeUnit.SECONDS)
.subscribe(System.out::println);
일정 시간 간격으로 최근에 Observable이 배출한 아이템들을 방출하는 연산자다.
1초 간격으로 아이템을 생성하고 sample(3, TimeUnit.SECONDS)로 3초에 한 번씩 최근 아이템을 방출한다.
skip

Observable.just(1, 2, 3, 4, 5, 6)
.skip(3)
.subscribe(System.out::println);
Observable이 발행하는 n개의 아이템을 무시하고 이후에 나오는 아이템을 발행하는 연산자다.
take

Observable.just(1, 2, 3, 4, 5, 6)
.take(2)
.subscribe(System.out::println);
take는 skip과 반대대는 내용이다. n개의 아이템만 방출하도록 하는 연산자다.
all

Observable.just(1, 2, 3)
.all(item -> item > 0)
.subscribe(System.out::println);
all 연산자는 발행된 모든 아이템이 특정 조건을 만족할 때 true를 반환한다.
하나라도 조건을 만족하지 않으면 false를 반환한다.
현재 코드에 0을 추가하면 false를 반환할 것이다.
amb

ArrayList<Observable<Integer>> list = new ArrayList<>();
list.add(Observable.just(10,20,30).delay(1000,TimeUnit.MILLISECONDS));
list.add(Observable.just(1,3,5));
list.add(Observable.just(2,4,6).delay(2000,TimeUnit.MILLISECONDS));
Observable.amb(list).subscribe(System.out::println);
여러 개의 Observable을 동시에 구독하고, 그중 가장 먼저 아이템을 발행하는 Observable을 선택할 때 amb연산자를 사용한다.
ArrayList<Observable<Integer>> list = new ArrayList<>();
Observable<Integer>형태에 ArrayList를 만들어 줍니다.
list.add(Observable.just(10,20,30).delay(1000,TimeUnit.MILLISECONDS));
list.add(Observable.just(1,3,5));
list.add(Observable.just(2,4,6).delay(2000,TimeUnit.MILLISECONDS));
just를 이용해 아이템을 생성하고 list에 담습니다. 첫 번째와 마지막은 딜레이를 주었습니다.
Observable.amb(list).subscribe(System.out::println);
여러 개의 Observable을 담은 list를 새로운 Observable에 담아주고 구독해 줍니다.
첫 번째와 마지막 Observable은 딜레이를 주었기 때문에 두 번째 Observable의 아이템만 출력될 것입니다.
다음 시간에는 결합하는 연산자에 대해 알아보겠습니다.
수고하셨습니다!
'안드로이드' 카테고리의 다른 글
안드로이드 Retrofit 통신 사용방법 (0) | 2022.11.19 |
---|---|
안드로이드 RxJava #8 RxJava 연산자-(결합) (0) | 2022.11.10 |
안드로이드 RxJava #6 RxJava 연산자-(변형) (0) | 2022.11.08 |
안드로이드 RxJava #5 마블 다이어그램, RxJava 연산자-(생성) (0) | 2022.11.07 |
안드로이드 RxJava #4 Disposable (0) | 2022.11.04 |