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