[리엑티브 생산자 Publisher 3]  Single & Maybe & Completable
Language/Reactive

[리엑티브 생산자 Publisher 3] Single & Maybe & Completable

728x90
반응형

대량의 데이터가 아닌 최대 1건 이하만 데이터를 통지하는 생산자들 이다. 

 

 


Single


  • 데이터를 1건만 통지하거나 에러를 통지한다.
  • 데이터 통지 자체가 완료를 의미하기 때문에 완료 통지는 하지 않는다.
  • 데이터를 1건만 통지하므로 데이터 개수를 요청할 필요가 없다.
  • onNext( ), onComplete( )가 없으며 이 둘을 합한 onSuccess( )를 제공한다.
  • Single의 대표적인 소비자는 SingleObserver이다.
  • 클라이언트의 요청에 대응하는 서버의 응답이 Single을 사용하기 좋은 대표적인 예다. 

 

Single 클래스를 사용하여 현재 날짜와 시각을 통지하는 예제

 

 

create 연산자 사용 예제

/*** SingleOnSubscribe 생산자 */
Single<String> single = Single.create(new SingleOnSubscribe<String>() {
    @Override
    public void subscribe(SingleEmitter<String> emitter) throws Exception {
        emitter.onSuccess(DateUtil.getNowDate());
    }
});


/*** SingleObserver 소비자 */
single.subscribe(new SingleObserver<String>() {
    @Override
    public void onSubscribe(Disposable disposable) {
        // 아무것도 하지 않음.
    }

    @Override
    public void onSuccess(String data) {
        Logger.log(LogType.ON_SUCCESS, "# 날짜시각: " + data);
    }

    @Override
    public void onError(Throwable error) {
        Logger.log(LogType.ON_ERROR, error);
    }
});

수행 결과

 

 

람다 함수 사용 예제

Single<String> single = Single.create(
        emitter -> emitter.onSuccess(DateUtil.getNowDate()));

single.subscribe(
        data -> Logger.log(LogType.ON_SUCCESS, "# 날짜시각: " + data),
        error -> Logger.log(LogType.ON_ERROR, error)
);

수행 결과

 

just() 함수 사용 예제

Single.just(DateUtil.getNowDate())
        .subscribe(
                data -> Logger.log(LogType.ON_SUCCESS, "# 날짜시각: " + data),
                error -> Logger.log(LogType.ON_ERROR, error)
        );

수행 결과

 

Observable<String> observable = Observable.just(DateUtil.getNowDate());

Single.fromObservable(observable)
        .subscribe(
                data -> Logger.log(LogType.ON_SUCCESS, " # 날짜시각: " + data),
                error -> Logger.log(LogType.ON_ERROR, error)
        );

 

 


Maybe


  • 데이터를 1건만 통지하거나 1건도 통지하지 않고 완료 또는 에러를 통지한다.
  • 데이터 통지 자체가 완료를 의미하기 때문에 완료 통지는 하지 않는다.
  • 단, 데이터를 1건도 통지하지 않고 처리가 종료될 경우에는 완료 통지를 한다.
  • Maybe의 대표적인 소비자는 MaybeObserver이다. 

 

 

Maybe 클래스를 이용하여 데이터를 통지하는 예제

Maybe<String> maybe = Maybe.create(new MaybeOnSubscribe<String>() {
    @Override
    public void subscribe(MaybeEmitter<String> emitter) throws Exception {
        // emitter.onSuccess(DateUtil.getNowDate());
        emitter.onComplete();
    }
});


maybe.subscribe(new MaybeObserver<String>() {
    @Override
    public void onSubscribe(Disposable disposable) {
        // 아무것도 하지 않음.
    }
    @Override
    public void onSuccess(String data) {
        Logger.log(LogType.ON_SUCCESS, "# 현재 날짜시각: " + data);
    }

    @Override
    public void onError(Throwable error) {
        Logger.log(LogType.ON_ERROR, error);
    }

    @Override
    public void onComplete() {
        Logger.log(LogType.ON_COMPLETE);
    }
});

 

람다 함수로 표현한 예제

Maybe<String> maybe = Maybe.create(emitter -> {
    emitter.onSuccess(DateUtil.getNowDate());
    // emitter.onComplete();
});

maybe.subscribe(
        data -> Logger.log(LogType.ON_SUCCESS, "# 현재 날짜시각: " + data),
        error -> Logger.log(LogType.ON_ERROR, error),
        () -> Logger.log(LogType.ON_COMPLETE)
);

 

 

just() 연산자를

Single<String> single = Single.just(DateUtil.getNowDate());

Maybe.fromSingle(single)
        .subscribe(
                data -> Logger.log(LogType.ON_SUCCESS, "# 현재 날짜시각: " + data),
                error -> Logger.log(LogType.ON_ERROR, error),
                () -> Logger.log(LogType.ON_COMPLETE)
        );

 

 

 


Completable


  • 데이터 생산자이지만 데이터를 1건도 통지하지 않고 완료 또는 에러를 통지한다.
  • 데이터 통지의 역할 대신에 Completable 내에서 특정 작업을 수행한 후, 해당 처리가 끝났음을 통지하는 역할을 한다.
  • Completable의 대표적인 소비자는 CompletableObserver이다. 

 

 

 

728x90
반응형