RxJava 에서 Observable 클래스 만큼 자주 쓰이지 않지만, 종종 보이는 Single, Maybe 클래스에 대해서 알아 보겠습니다.
1. Single 클래스
Observable은 데이터를 무한하게 발행 할수 있지만, Single 클래스는 오직 1개의 데이터만 발행하도록 한정 합니다. 보통 결과가 유일한 서버 API를 호출할 때 유용하게 사용 할수 있습니다. 따라서, 데이터 하나가 발행과 동시에 종료 됩니다. onNext(), onComplete() 함수가 onSuccess() 함수로 통합된 것 입니다. 따라서, Single 클래스의 라이프 사이클 함수는 onSuccess(T value) 함수와 onError() 함수로 구성 됩니다.
// 1. first() 함수를 호출해 Single 객체 생성
String[] colors = {"Red", "Blue", "Gold"};
Observable.fromArray(colors)
.first("default value")
.subscribe(System.out::println);
// 2. take() 함수에서 Single 객체 생성
Observable.just(new Order("ORD-1"), new Order("ORD-2"))
.take(1)
.single(new Order("default order"))
.subscribe(System.out::println);
첫번째 예제는 여러 개의 데이터를 발행 할 수 있는 Observable을 Single 객체로 변환 할 수 있습니다. first() 함수를 호출하면, Observable이 Single 객체로 변환 합니다. 따라서 첫 번째 데이터를 발행 후 onSuccess 이벤트가 발생 합니다. first() 함수의 파라미터로 default 값을 받을 수 있습니다. 두번째 예제는 take(1).single() 함수로도 Single 클래스를 반환 합니다. single() 함수의 파라미터로 default 값을 받을 수 있습니다.
Single 클래스에서 데이터를 1개 이상 발행 한다면?
Observable
.just("Hello World", "Error")
.single("default")
.subscribe(System.out::println);
만약, Single 클래스의 한가지 이상의 데이터를 발행하면, 두번째 값을 발행하면서 onNext 이벤트가 발생할 때, OnErrorNotImplementedException 에러가 발생 합니다.
2. Maybe 클래스
'Maybe'는 '아마도' 라는 뜻을 가지고 있습니다. 따라서 Single 클래스는 1개 데이터 발행, Maybe 클래스는 0 또는 1개의 데이터를 발행 후 완료 합니다. Maybe 클래스는 단독으로 쓰이기 보다 Observable의 특정 연산자를 통해 생성 할 때가 많습니다. firstElement(), flatMapMaybe(), singleElement(), reduce(), lastElement() 와 같은 연산의 반환 타입 입니다.
'Reactive Programing' 카테고리의 다른 글
FlatMap 파헤치기 (0) | 2021.02.02 |
---|---|
Cold Observable vs Hot Observable (PublishSubject 클래스) (0) | 2020.11.22 |
리액티브 프로그래밍 (Reactive Programming) RxJava (0) | 2020.11.01 |
Java API를 RxJava와 통합 하는 방법 (0) | 2020.10.31 |
Flowable 배압(BackPressure) 대응 (0) | 2020.10.30 |