본문 바로가기

안드로이드

안드로이드 RxJava #7 RxJava 연산자-(필터링)

 

안녕하세요

이번 시간에는 필터링하는 연산자에 대해 알아보겠습니다.

 

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의 아이템만 출력될 것입니다.

 

 

 

 

 

다음 시간에는 결합하는 연산자에 대해 알아보겠습니다.

수고하셨습니다!

반응형