Page 30 -
P. 30

.scan((sum, data) -> { //  3
                                 if (calcMethod = = State.ADD) { //  4
                                     return sum + data;
                                 } else {
                                     return sum * data;
                                 }
                     });


                     // 구독하고 받은 데이터를 출력한다
                     flowable.subscribe(data -> System.out.println("data=" + data)); //  5


                     // 잠시 기다리렸다가 계산 방법을 곱셈으로 변경한다
                     Thread.sleep(1000);
                     System.out.println("계산 방법 변경");
                     calcMethod = State.MULTIPLY; //  6

                     // 잠시 기다린다
                     Thread.sleep(2000);
                 }


                1   300밀리초마다 0부터 시작하는 값을 비동기로 통지하는 Flowable을 interval 메서드로 생성한다.
                2   take 메서드로 데이터를 7건까지 통지한다.

                3    통지된 데이터를 scan 메서드를 사용해 집계하고 데이터를 받아 계산할 때마다 데이터를 통지하게 한다. 함수형
                  인터페이스의 인자 sum은 이전까지의 계산 결과이고, data는 Flowable부터 전달받은 통지 데이터다.
                4   외부 변수의 값에 따라 계산 방법을 다르게 한다(원래는 하면 안 된다).

                5   subscribe 메서드로 구독하고, 전달받은 데이터를 출력한다.
                6   1000밀리초를 대기한 뒤에 calcMethod의 값을 변경한다.

                실행 결과
                 data=0
                 data=1
                 data=3
                 계산 방법 변경
                 data=9
                 data=36
                 data=180
                 data=1080








         038





     RxJava 리액티브 프로그래밍(본문)최종.indd   38                                                      2019-03-26   오전 11:26:31
   25   26   27   28   29   30   31   32   33   34   35