-
조건과 불린 연산자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)); } }
[참고 자료]
반응형