ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 조건과 불린 연산자
    BackEnd/RxJava 2023. 7. 13. 05:50
    반응형

    all

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

    package com.itvillage.chapter05.chapter0508;
    
    import com.itvillage.common.CarMaker;
    import com.itvillage.common.SampleData;
    import com.itvillage.utils.LogType;
    import com.itvillage.utils.Logger;
    import io.reactivex.Observable;
    
    /**
     * 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));
        }
    }

     

    amb

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

     

    contains

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

    package com.itvillage.chapter05.chapter0508;
    
    import com.itvillage.common.CarMaker;
    import com.itvillage.common.SampleData;
    import com.itvillage.utils.LogType;
    import com.itvillage.utils.Logger;
    import io.reactivex.Observable;
    
    /**
     * 통지된 데이터 중에 파라미터로 입력한 조건에 맞는 데이터가 있는지 판단하는 예제
     */
    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));
        }
    }

     

    defaultIfEmpty

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

    package com.itvillage.chapter05.chapter0508;
    
    import com.itvillage.utils.LogType;
    import com.itvillage.utils.Logger;
    import io.reactivex.Observable;
    
    /**
     * 통지되는 데이터가 없을 경우, 디폴트 값을 통지하는 예제
     */
    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));
        }
    }

     

    sequenceEqual

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

    package com.itvillage.chapter05.chapter0508;
    
    import com.itvillage.common.CarMaker;
    import com.itvillage.common.SampleData;
    import com.itvillage.utils.LogType;
    import com.itvillage.utils.Logger;
    import com.itvillage.utils.TimeUtil;
    import io.reactivex.Observable;
    import io.reactivex.schedulers.Schedulers;
    
    /**
     * 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));
        }
    }

     

     

     

    [참고 자료]

    반응형

    'BackEnd > RxJava' 카테고리의 다른 글

    Subject  (0) 2023.07.14
    집계 연산자  (0) 2023.07.13
    유틸리티 연산자  (0) 2023.07.09
    에러 처리 연산자  (0) 2023.07.08
    결합 연산자  (1) 2023.07.08

    댓글

Designed by Tistory.