본문 바로가기

프로그래밍/RxJava

[RxJava] Single - just() 함수와 Observable에서 Single 클래스를 사용하는 다양한 방법

just()함수 사용

Single 클래스 Observable 클래스와 거의 같은 방법으로 활용이 가능하다.

아래 코드는 just() 함수를 활용해 Single 객체를 생성하는 코드이다.

private void single(){
        Single<String> source = Single.just("Hello Single");
        source.subscribe(System.out::println);
    }
결과값
Hello Single

Observable에서 Single 클래스 사용

Single은 Observable의 특수한 형태이므로, Observable에서 변환할 수있다.

아래 코드는 Observable에서 Single 클래스를 사용하는 다양하는 방법이다.

private void fromObservable(){

        //1. 기존 Observable에서 Single 객체로 변환하기.
        Observable<String> source = Observable.just("Hello Single");
        Single.fromObservable(source)
                .subscribe(System.out::println);

        //2. single() 함수를 호출해 Single 객체 생성하기
        Observable.just("Hello Single")
                .single("default item")
                .subscribe(System.out::println);

        //3. first() 함수를 호출해 Single 객체 생성하기
        String[] colors = {"Red", "Blue", "Gold"};
        Observable.fromArray(colors)
                .first("default value")
                .subscribe(System.out::println);

        //4. empty Observable에서 Single 객체 생성하기
        Observable.empty()
                .single("default value")
                .subscribe(System.out::println);

        //5. take() 함수에서 Single 객체 생성하기
        Observable.just(new Order("ORD-1"), new Order("ORD-2"))
                .take(1)
                .single(new Order("default order"))
                .subscribe(System.out::println);
    }
public class Order {
    private String mId;

    public Order(String id){
        mId = id;
    }

    public String getId(){
        return mId;
    }

    @Override
    public String toString() {
        return "Order ID: " + mId;
    }
}
결과값
Hello Single
Hello Single
Red
default value
Order ID: ORD-1

 

첫 번째 예는 Single.fromObservable을 활용하는 방법이다.

기존 Observable에서 첫 번째 값을 발행하면 onSuccess 이벤트를 호출한 후 종료한다.

 

두 번째 예는 Observable.just()를 통해서 생성된 Observable에 single() 함수를 호출한다.

single()함수default value를 인자로 갖는다.

Observable에서 값이 발행하지 않을 때에도 인자로 넣은 기본값이 대신 발행된다.

 

세 번째 예는 여러개의 데이터를 발행할 수 있는 Observable을 Single 객체로 변환하는 것이다.

first() 함수를 호출하면 Observable이 Single 객체로 변환된다.

또한, 하나 이상의 데이터를 발행하더라도, 첫 번째 데이터 발행 후 onSuccess 이벤트가 발생한다.

자세한 내용은 추후에 설명하도록하겠다.

 

네 번째 예는 empty() 함수를 통해서 Single 객체를 생성하는 방법이다.

세 번째 방법처럼 첫 번째 데이터를 발행 후 onSuccess 이벤트가 발생한다는 점이 같다.

또한 두 번째 예처럼 Observalbe에서 값이 발행되지 않을 때도 기본값을 갖는 Single 객체를 변환할 수 있다.

 

마지막 다섯 번째 예는 take() 함수를 사용하는 방법이다.

take()에 대한 자세한 내용은 나중에 다룰것이다.

여기서는 Single 객체를 생성할 수 있다는 정도만 알고 넘어가도록 하자!

String 같은 기본 타입뿐만 아니라, Order와 같은 사용자 정의 클래스도 Single에서 사용할 수 있다.

Single 클래스에 넘겨진 Order 객체의 toString() 메서드가 호출된다.

 

Single 클래스의 올바른 사용 방법

지금까지 Observable에서 Single 객체를 생성할 때 데이터 하나만 발행하도록 보장했다.

하지만, 실제 just()함수에 여러개의 값을 넣으면 어떻게 될까??

private void errorCase(){
        Single<String> source = Observable
                .just("Hello Single", "Error")
                .single("default item");
        source.subscribe(System.out::println);
    }
Caused by: java.lang.IllegalArgumentException: Sequence contains more than one element!

위와 같은 에러가 발생한다.

에러 메시지는 element가 하나 이상이라고 뜨게 된다.

그리고 두 번째 값을 발행하면서 onNext() 이벤트가 발생하면서 에러가 발생했다고 알려주게 된다.

즉, Single 클래스를 사용할 때는 하나의 발행에 대해서만 처리할 수 있도록 주의하자.

 

Single 클래스 전체 코드 보러가기

'프로그래밍 > RxJava' 카테고리의 다른 글

[RxJava] 뜨거운 Observable  (0) 2020.02.20
[RxJava] Maybe 클래스  (0) 2020.02.17
[RxJava] Single 클래스  (0) 2020.02.16
[RxJava] Observable - fromPublisher() 함수  (0) 2020.02.16
[RxJava] Observable - fromFuture() 함수  (0) 2020.02.16