데이터 집계 연산자
count
- Observable이 통지한 데이터의 총 개수를 통지한다.
- 총 개수만 통지하면 되므로 결과값은 Single로 반환한다.
- 데이터의 총 개수를 통지하는 시점은 완료 통지를 받은 시점이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
/**
* count를 이용하여 차량의 총 대수를 계산하는 예제
*/
public class ObservableCountExample01 {
public static void main(String[] args) {
Observable.fromIterable(SampleData.carList)
.count()
.subscribe(data -> Logger.log(LogType.ON_NEXT, data));
}
}
/*
onNext() | main | 01:32:38.411 | 9
*/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/**
* count을 이용하여 3개 지역에서 측정된 미세먼지 농도의 총 측정 건수를 계산하는 예제
*/
public class ObservableCountExample02 {
public static void main(String[] args) {
Observable.concat(
Arrays.asList(
Observable.fromIterable(SampleData.seoulPM10List),
Observable.fromIterable(SampleData.busanPM10List),
Observable.fromIterable(SampleData.incheonPM10List)
)
)
.count()
.subscribe(data-> Logger.log(LogType.ON_NEXT, data));
}
}
/*
onNext() | main | 01:34:49.188 | 72
*/
reduce
- 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
/**
* reduce를 이용해 1부터 10까지의 sum을 구하는 예제(초기값 없음)
*/
public class ObservableReduceExample01 {
public static void main(String[] args) {
Observable.just(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
.doOnNext(data -> Logger.log(LogType.DO_ON_NEXT, data))
.reduce((x, y) -> x + y)
.subscribe(result -> Logger.log(LogType.ON_NEXT, "# 1부터 10까지의 누적 합계: " + result));
}
}
/*
doOnNext() | main | 01:53:16.921 | 1
doOnNext() | main | 01:53:16.925 | 2
doOnNext() | main | 01:53:16.926 | 3
doOnNext() | main | 01:53:16.926 | 4
doOnNext() | main | 01:53:16.926 | 5
doOnNext() | main | 01:53:16.926 | 6
doOnNext() | main | 01:53:16.926 | 7
doOnNext() | main | 01:53:16.926 | 8
doOnNext() | main | 01:53:16.926 | 9
doOnNext() | main | 01:53:16.927 | 10
onNext() | main | 01:53:16.928 | # 1부터 10까지의 누적 합계: 55
*/
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
/**
* reduce를 이용해 1부터 10까지 sum을 구하는 예제(초기값 있음)
*/
public class ObservableReduceExample02 {
public static void main(String[] args) {
Observable.just(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
// .doOnNext(data -> Logger.log(LogType.DO_ON_NEXT, data))
.reduce(0, (x, y) -> {
Logger.log(LogType.PRINT, "# reduce 입력 값 : " + x + ", " + y);
return x + y;
})
.subscribe(data -> Logger.log(LogType.ON_NEXT, data));
}
}
/*
print() | main | 01:55:59.380 | # reduce 입력 값 : 0, 1
print() | main | 01:55:59.382 | # reduce 입력 값 : 1, 2
print() | main | 01:55:59.383 | # reduce 입력 값 : 3, 3
print() | main | 01:55:59.383 | # reduce 입력 값 : 6, 4
print() | main | 01:55:59.383 | # reduce 입력 값 : 10, 5
print() | main | 01:55:59.383 | # reduce 입력 값 : 15, 6
print() | main | 01:55:59.383 | # reduce 입력 값 : 21, 7
print() | main | 01:55:59.383 | # reduce 입력 값 : 28, 8
print() | main | 01:55:59.383 | # reduce 입력 값 : 36, 9
print() | main | 01:55:59.383 | # reduce 입력 값 : 45, 10
onNext() | main | 01:55:59.384 | 55
*/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
/**
* reduce를 이용해 문자열이 누적되어 처리되어 출력되는 예제
*/
public class ObservableReduceExample03 {
public static void main(String[] args) {
Observable.just("a", "b", "c", "d", "e")
// .doOnNext(data -> Logger.log(LogType.DO_ON_NEXT, data))
.reduce((x, y) -> "(" + x + ", " + y + ")")
.subscribe(data -> Logger.log(LogType.ON_NEXT, data));
}
}
/*
onNext() | main | 01:58:06.676 | ((((a, b), c), d), e)
*/
scan
- reduce는 전체 처리된 결과를 전달하지만 scan은 중간 처리되는 과정들을 통지한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/**
* scan을 이용해 문자열이 누적되어 처리되어 출력되는 예제
* - 문자열의 처리 중간 결과를 계속해서 출력한다.
*/
public class ObservableScanExample03 {
public static void main(String[] args) {
Observable.just("a", "b", "c", "d", "e")
// .doOnNext(data -> Logger.log(LogType.DO_ON_NEXT, data))
.scan((x, y) -> "(" + x + ", " + y + ")")
.subscribe(result -> Logger.log(LogType.ON_NEXT, "# 출력 결과: " + result));
}
}
/*
onNext() | main | 02:01:30.654 | # 출력 결과: a
onNext() | main | 02:01:30.659 | # 출력 결과: (a, b)
onNext() | main | 02:01:30.659 | # 출력 결과: ((a, b), c)
onNext() | main | 02:01:30.660 | # 출력 결과: (((a, b), c), d)
onNext() | main | 02:01:30.660 | # 출력 결과: ((((a, b), c), d), e)
*/
기타 예제
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
/**
* 10부터 1까지 역순으로 뺄셈한 최종 결과 값을 출력하세요.
* 예) 10 - 9 - 8 - 7 - 6 - 5 - 4 - 3 - 2 - 1 = -35
*/
public class QuizAnswerForChapter050901 {
public static void main(String[] args) {
final int seed = 10;
Observable.range(1, 9)
.reduce(seed, (x, y) -> {
int b = seed - y;
Logger.log(LogType.PRINT, x + ", " + b);
return x - b;
})
.subscribe(data -> Logger.log(LogType.ON_NEXT, data));
}
}
/*
print() | main | 02:07:35.214 | 10, 9
print() | main | 02:07:35.216 | 1, 8
print() | main | 02:07:35.216 | -7, 7
print() | main | 02:07:35.216 | -14, 6
print() | main | 02:07:35.216 | -20, 5
print() | main | 02:07:35.216 | -25, 4
print() | main | 02:07:35.217 | -29, 3
print() | main | 02:07:35.217 | -32, 2
print() | main | 02:07:35.217 | -34, 1
onNext() | main | 02:07:35.217 | -35
*/
이 글은 inflearn에 있는 Kevin의 알기 쉬운 RxJava 1부를 공부하고 작성한 글입니다.
강의영상 링크