Posts RxJava - 조건과 불린 연산자
Post
Cancel

RxJava - 조건과 불린 연산자

조건과 불린 연산자

all

  • 통지되는 모든 데이터가 설정한 조건에 맞는지를 판단한다.
  • 결과값을 한번만 통지하면 되기떄문에 true/false 값을 Single로 반환한다.
  • 통지된 데이터가 조건에 맞지 않는다면 이후 데이터는 구독 헤지되어 통지 되지 않는다.

all

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/**
 * all을 이용하여 통지된 모든 데이터가 파라미터로 입력된 조건과 일치하는지 판단하는 예제
 */
public class ObservableAllExample {
    public static void main(String[] args) {
        Observable.fromIterable(SampleData.carList)
                .doOnNext(car -> Logger.log(LogType.DO_ON_NEXT, "Car Maker: " + car.getCarMaker() +
                        ", \tCar Name: " + car.getCarName()))
                .map(car -> car.getCarMaker())
                .all(carMaker -> carMaker.equals(CarMaker.CHEVROLET))
//                .all(CarMaker.CHEVROLET::equals)
                .subscribe(data -> Logger.log(LogType.ON_NEXT, data));
    }
}
/*
doOnNext() | main | 11:53:37.966 | Car Maker: CHEVROLET, 	Car Name: 말리부
doOnNext() | main | 11:53:37.971 | Car Maker: HYUNDAE, 	Car Name: 쏘렌토
onNext() | main | 11:53:37.972 | false
*/

amb

  • 여러개의 Observable 중에서 최초 통지 시점이 가장 빠른 Observable의 데이터만 통지되고, 나머지 Observable은 무시된다.
  • 즉, 가장 먼저 통지를 시작한 Observable의 데이터만 통지된다.

amb

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
29
30
31
32
33
34
35
36
37
38
39
40
41
/**
 * amb를 이용하여 가장 먼저 통지되는 Observable을 선택하여 통지하는 예제
 */
public class ObservableAmbExample {
    public static void main(String[] args) {

        List<Observable<Integer>> observables = Arrays.asList(
                Observable.fromIterable(SampleData.salesOfBranchA)
                        .delay(200L, TimeUnit.MILLISECONDS)
                        .doOnComplete(() -> Logger.log(LogType.DO_ON_COMPLETE, "# branch A's sales")),
                Observable.fromIterable(SampleData.salesOfBranchB)
                        .delay(300L, TimeUnit.MILLISECONDS)
                        .doOnComplete(() -> Logger.log(LogType.DO_ON_COMPLETE, "# branch B's sales")),
                Observable.fromIterable(SampleData.salesOfBranchC)
                        .delay(500L, TimeUnit.MILLISECONDS)
                        .doOnComplete(() -> Logger.log(LogType.DO_ON_COMPLETE, "# branch C's sales"))
        );

        Observable.amb(observables)
                .doOnComplete(() -> Logger.log(LogType.DO_ON_COMPLETE, "# 완료"))
                .subscribe(data -> Logger.log(LogType.ON_NEXT, data));

        TimeUtil.sleep(1000L);
    }
}
/*
onNext() | RxComputationThreadPool-1 | 11:59:39.596 | 15000000
onNext() | RxComputationThreadPool-1 | 11:59:39.600 | 25000000
onNext() | RxComputationThreadPool-1 | 11:59:39.600 | 10000000
onNext() | RxComputationThreadPool-1 | 11:59:39.601 | 35000000
onNext() | RxComputationThreadPool-1 | 11:59:39.601 | 23000000
onNext() | RxComputationThreadPool-1 | 11:59:39.601 | 40000000
onNext() | RxComputationThreadPool-1 | 11:59:39.601 | 50000000
onNext() | RxComputationThreadPool-1 | 11:59:39.601 | 45000000
onNext() | RxComputationThreadPool-1 | 11:59:39.602 | 35000000
onNext() | RxComputationThreadPool-1 | 11:59:39.602 | 23000000
onNext() | RxComputationThreadPool-1 | 11:59:39.602 | 15000000
onNext() | RxComputationThreadPool-1 | 11:59:39.602 | 10000000
doOnComplete() | RxComputationThreadPool-1 | 11:59:39.602 | # branch A's sales
doOnComplete() | RxComputationThreadPool-1 | 11:59:39.602 | # 완료
*/

contains

  • 파라미터의 데이터가 Observable에 포함되어 있는지를 판단한다.
  • 결과값을 한번만 통지하면 되기때문에 true/false 값을 Single로 반환한다.
  • 결과 통지 시점을 Observable에 포함된 데이터를 통지하거나 완료를 통지할때이다.

contains

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/**
 * 통지된 데이터 중에 파라미터로 입력한 조건에 맞는 데이터가 있는지 판단하는 예제
 */
public class ObservableContainsExample {
    public static void main(String[] args) {
        Observable.fromArray(SampleData.carMakersDuplicated)
                .doOnNext(data -> Logger.log(LogType.DO_ON_NEXT, data))
                .contains(CarMaker.SAMSUNG)
                .subscribe(data -> Logger.log(LogType.ON_NEXT, data));
    }
}
/*
doOnNext() | main | 00:12:13.336 | CHEVROLET
doOnNext() | main | 00:12:13.338 | HYUNDAE
doOnNext() | main | 00:12:13.338 | SAMSUNG
onNext() | main | 00:12:13.338 | true
*/

defaultEmpty

  • 통지할 데이터가 없을 경우 파라미터로 입력된 값을 통지한다.
  • 즉, 연산자 이름 의미 그대로 Observable에 통지할 데이터가 없이 비어 있는 상태일때 디폴토 값을 통지한다.

defaultIFEmpty

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/**
 * 통지되는 데이터가 없을 경우, 디폴트 값을 통지하는 예제
 */
public class ObservableDefaultIfEmptyExample {
    public static void main(String[] args) {
        Observable.just(1, 2, 3, 4, 5)
                .filter(num -> num > 10)
                .defaultIfEmpty(10)
                .subscribe(data -> Logger.log(LogType.ON_NEXT, data));
    }
}
/*
onNext() | main | 00:26:54.535 | 10
*/

sequenceEqual

  • 두 Observable이 동일한 순서로 동일한 갯수의 같은 데이터를 통지하는지 판단한다.
  • 통지 시점과 무관하게 데이터의 정합성만 판단하므로 통지 시점이 다르더라도 조건이 맞다면 true를 통지한다.

sequenceEqual

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
/**
 * sequenceEqual 을 이용하여 두 Observable 의 모든 데이터가 같은지(순서, 데이터 수, 데이터 타입)를 판단하는 예제
 */
public class ObservableSequenceEqualExample {
    public static void main(String[] args) {
        Observable<CarMaker> observable1 =
                Observable
                        .fromArray(SampleData.carMakers)
                        .subscribeOn(Schedulers.computation())
                        .delay(carMaker -> {
                            TimeUtil.sleep(500L);
                            return Observable.just(carMaker);
                        }).doOnNext(data -> Logger.log(LogType.DO_ON_NEXT, "# observable1 : " + data));

        Observable<CarMaker> observable2 =
                Observable
                        .fromArray(SampleData.carMakersDuplicated)
                        .delay(carMaker -> {
                            TimeUtil.sleep(1000L);
                            return Observable.just(carMaker);
                        }).doOnNext(data -> Logger.log(LogType.DO_ON_NEXT, "# observable2 : " + data));


        Observable.sequenceEqual(observable1, observable2)
                .subscribe(data -> Logger.log(LogType.ON_NEXT, data));
    }
}
/*
doOnNext() | RxComputationThreadPool-1 | 00:45:10.372 | # observable1 : CHEVROLET
doOnNext() | main | 00:45:10.827 | # observable2 : CHEVROLET
doOnNext() | RxComputationThreadPool-1 | 00:45:10.880 | # observable1 : HYUNDAE
doOnNext() | RxComputationThreadPool-1 | 00:45:11.385 | # observable1 : SAMSUNG
doOnNext() | main | 00:45:11.829 | # observable2 : HYUNDAE
doOnNext() | RxComputationThreadPool-1 | 00:45:11.891 | # observable1 : SSANGYOUNG
doOnNext() | RxComputationThreadPool-1 | 00:45:12.396 | # observable1 : KIA
doOnNext() | main | 00:45:12.834 | # observable2 : SAMSUNG
doOnNext() | main | 00:45:13.838 | # observable2 : SSANGYOUNG
doOnNext() | main | 00:45:14.841 | # observable2 : CHEVROLET
onNext() | main | 00:45:14.841 | false
doOnNext() | main | 00:45:15.846 | # observable2 : HYUNDAE
doOnNext() | main | 00:45:16.850 | # observable2 : KIA
doOnNext() | main | 00:45:17.853 | # observable2 : SSANGYOUNG
*/

이 글은 inflearn에 있는 Kevin의 알기 쉬운 RxJava 1부를 공부하고 작성한 글입니다.
강의영상 링크

This post is licensed under CC BY 4.0 by the author.

RxJava - 유틸리티 연산자

RxJava - 데이터 집계 연산자

Comments powered by Disqus.