조건과 불린 연산자
all
- 통지되는 모든 데이터가 설정한 조건에 맞는지를 판단한다.
- 결과값을 한번만 통지하면 되기떄문에 true/false 값을 Single로 반환한다.
- 통지된 데이터가 조건에 맞지 않는다면 이후 데이터는 구독 헤지되어 통지 되지 않는다.
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의 데이터만 통지된다.
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에 포함된 데이터를 통지하거나 완료를 통지할때이다.
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에 통지할 데이터가 없이 비어 있는 상태일때 디폴토 값을 통지한다.
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를 통지한다.
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부를 공부하고 작성한 글입니다.
강의영상 링크