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