Posts RxJava - 데이터 집계 연산자
Post
Cancel

RxJava - 데이터 집계 연산자

데이터 집계 연산자

count

  • Observable이 통지한 데이터의 총 개수를 통지한다.
  • 총 개수만 통지하면 되므로 결과값은 Single로 반환한다.
  • 데이터의 총 개수를 통지하는 시점은 완료 통지를 받은 시점이다.

count

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이 통지한 데이터가 숫자일 경우 파라미터로 지정한 함수형 인터페이스에 정의된 계산 방식으로 값을 집계 할 수 있다.

reduce

reduce second

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부를 공부하고 작성한 글입니다.
강의영상 링크

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

RxJava - 조건과 불린 연산자

RxJava - Processor와 Subject

Comments powered by Disqus.