목차
이 페이지는 Flowable과 Observable의 생성 연산자 목차다. 데이터가 준비된 방식에 따라 연산자를 고르면 된다.
| 데이터의 출처 | 먼저 볼 연산자 |
|---|---|
| 이미 있는 값이나 컬렉션 | just, fromArray, fromIterable |
| 구독 시점에 실행할 계산 | fromCallable, defer |
| 연속된 숫자 | range, rangeLong |
| 시간 간격 또는 지연 | interval, timer |
| 값 없이 종료하거나 실패 | empty, error |
| 종료하지 않는 스트림 | never |
예를 들어 just(expensiveCall())은 just를 호출하기 전에 함수가 평가된다. 반대로 fromCallable(() -> expensiveCall())은 구독 시점에 계산한다. 값이 언제 만들어지는지를 확인하면 연산자 선택이 쉬워진다.
Flowable은 배압을 다루는 스트림이고 Observable은 같은 방식의 배압 계약을 제공하지 않는다. 무한히 값을 만들거나 생산 속도가 빨라지는 소스라면 소비 속도와 버퍼 정책도 함께 살펴본다.
같은 값을 만들지만 실행 시점이 다른 예
AtomicInteger counter = new AtomicInteger();
Flowable<Integer> immediate = Flowable.just(counter.incrementAndGet());
Flowable<Integer> deferred = Flowable.fromCallable(counter::incrementAndGet);
immediate.subscribe(System.out::println); // 1
immediate.subscribe(System.out::println); // 1
deferred.subscribe(System.out::println); // 2
deferred.subscribe(System.out::println); // 3
이 예제는 java.util.concurrent.atomic.AtomicInteger와 RxJava 2의 Flowable을 사용한다. just에 전달할 값은 스트림을 만들 때 이미 계산된다. fromCallable은 구독할 때마다 함수를 실행한다. 요청마다 새 값을 조회해야 한다면 후자가 알맞고, 이미 확정된 한 값을 전달한다면 전자가 단순하다.
interval과 never는 완료 시점이 없을 수 있다. 테스트나 서버 코드에서 이 소스를 사용하면 구독 해제 또는 take 같은 종료 조건을 함께 둔다. empty는 즉시 완료되고 error는 즉시 실패 신호를 보낸다. 두 연산자는 값이 없는 정상 결과와 실패 결과를 구별해 흐름을 시험할 때 유용하다.

