Android 개발/Retrofit, RxJava, RxAndroid, OKHttp

RxJava first()와 single()의 차이 총정리

Developer88 2024. 11. 4. 00:01
반응형

 

RxJava에서 Observable을 Single타입으로 변환할 수 있는 방법이 있는데요.

바로 first()와 single()을 사용하는 것 입니다.

오늘은 이 둘의 차이를 알아보고 적절하게 사용하는 방법에 대해 보겠습니다.

 

1. first()와 single의 차이

RxJava의 Observable의 first()나 single()을 사용하면,

하나의 아이템만을 구독할 수 있습니다.

 

이 둘을 표로 비교하면 다음과 같습니다.

 

  first() single()
사용 스트림의 첫 번째 항목만 필요할 때 사용 정확히 하나의 항목만 
방출되는지 확인하고, 
그 항목을 방출
(여러개 방출시 에러)
에러처리 비어있으면 
NoSuchElementException
발생 시킴
비어있거나 
둘 이상의 항목을 포함하면 
에러를 발생 시킴
완료 시점 첫 번째 항목을 찾는 즉시 완료 Observable이 완료될 때까지 기다려 
정확히 하나의 항목만 
방출되었는지 확인
안전성 single()은 first()보다 
더 엄격한 검사를 수행하여 
예상치 못한 데이터 흐름을 방지

 

둘에 대한 코드를 보면서 정리해 보겠습니다.

 

2. first()

first()는 Observable에서 첫번째 항목만 사용하는 연산자입니다.

아래와 같이 첫 번째 항목을 방출하고 완료됩니다.

 

Observable.just(1, 2, 3)
    .first()
    .subscribe { println(it) } // 출력: 1

 

 Observable이 비어있으면 NoSuchElementException을 발생시킵니다.

 

3. single() 

single() 연산자는,

Observable에서 정확히 하나의 항목만 방출되는지 확인하고, 그 항목을 방출합니다

여러개 중 하나가 아니라, 

꼭 하나의 항목만 존재할 때 그것을 출력해주는,

엄격한 연산자 입니다. 

그러니, 사용할 때도 주의가 필요하겠지요.

 

Observable.just(1)
    .single()
    .subscribe { println(it) } // 출력: 1

 

하나만 방출되는지 확인한다는 말이 조금 어색하게 들릴 수 있는데요.

single은 아이템이 비어있을 때도 에러를 발생시키지만,

둘 이상의 항목을 포함할 경우에도 에러를 발생시킵니다.

 

우리말로 하면, 방출되는 아이템이 꼭 하나여야만 한다는 것입니다.

그렇지 않으면 아래와 같이 에러를 방출시킵니다.

 

Observable.just(1, 2, 3)
    .single()
    .subscribe(
        { println(it) },
        { println("Error: ${it.message}") }
    ) // 출력: Error: Sequence contains more than one element!

 

 

이러한 single()의 차이를 이해하고,

first()와 single()의 차이를 적절하게 사용해야 하겠습니다.

728x90