본문 바로가기
안드로이드/RxJava

[안드로이드] RxJava - 생성 연산자

by 안드뽀개기 2022. 4. 1.
반응형

 

just

: 인자로 받은 데이터를 순서대로 발행하는 Observable 생성 연산자이며, 최대 10개까지 발행할 수 있다.

fun main(){
Observable.just("안","녕","하","세","요")
.subscribe {
print(it)
}
}
결과
안녕하세요
view raw RxJava.kt hosted with ❤ by GitHub

 

 

create

: emitter를 이용하여 데이터를 발행하고 onNext(), onComplete(), onError() 함수를 이용하여 데이터를 발행하거나 데이터의 발행을 완료처리하거나 데이터 발행도중 에러가 발생했음을 발생한다.

fun main(){
Observable.create<Char>{ emitter ->
val characterList = listOf('A','B','C','D','E')
characterList.forEachIndexed { index, c ->
emitter.onNext(c)
}
}.subscribe {
print(it)
}
}
결과
ABCDE
view raw RxJava.kt hosted with ❤ by GitHub

 

onComplete() 호출하면 데이터 발행이 완료되었기 때문에 더이상 데이터가 발행되지 않는다.

fun main(){
Observable.create<Char>{ emitter ->
val characterList = listOf('A','B','C','D','E')
characterList.forEachIndexed { index, c ->
if (index == 2) {
emitter.onComplete()
}
emitter.onNext(c)
}
}.subscribe {
print(it)
}
}
결과
AB
view raw RxJava.kt hosted with ❤ by GitHub

 

 

interval

: 시간 간격을 두고 데이터를 전달하는 stream을 만듭니다. 기본적으로 SchedulerSupport.COMPUTATION 스케쥴러로 별도의 스레드에서 실행이됩니다. 그 때문에 아래 코드를 실행하면 메인스레드가 먼저 종료되어 print가 되지 않아 메인스레드의 종료를 3초 늦추는 sleep 코드를 넣어 놨습니다.

fun main(){
val dateTimeFormatter: DateTimeFormatter = DateTimeFormatter.ofPattern("hh:mm:ss.SSS")
Observable.interval(1000L, TimeUnit.MILLISECONDS)
.subscribe {
println(LocalTime.now().format(dateTimeFormatter))
}
Thread.sleep(3000)
}
결과
10:54:18.990
10:54:19.974
10:54:20.974
view raw RxJava.kt hosted with ❤ by GitHub

 

 

timer

: 설정한 딜레이 후 데이터를 발행하는 스트림을 만듭니다. interval과 유사하지만 단 한번만 실행이 됩니다. 

fun main(){
val dateTimeFormatter: DateTimeFormatter = DateTimeFormatter.ofPattern("hh:mm:ss.SSS")
Observable.timer(2000L, TimeUnit.MILLISECONDS)
.subscribe {
println(LocalTime.now().format(dateTimeFormatter))
}
Thread.sleep(3000)
}
결과
10:55:35.192
view raw RxJava.kt hosted with ❤ by GitHub

 

 

range(n, m)

: n 부터 m만큼 증가하는 스트림을 만듭니다.

fun main(){
val dateTimeFormatter: DateTimeFormatter = DateTimeFormatter.ofPattern("hh:mm:ss.SSS")
Observable.range(10, 5)
.subscribe {
println(it)
}
}
결과
10
11
12
13
14
view raw RxJava.kt hosted with ❤ by GitHub

 

 

repeat

: 반복 횟수를 지정하여, 횟수만큼 반복하는 스트림을 만듭니다.

fun main(){
Observable.just("안녕","하세요")
.repeat(2)
.subscribe {
println(it)
}
}
결과
안녕
하세요
안녕
하세요
view raw RxJava.kt hosted with ❤ by GitHub

 

 

fromArray

: array(배열)의 스트림을 만듭니다. *를 붙이면 요소를 발행하고, 붙이지 않으면 배열자체를 발행합니다.

fun main(){
val array = arrayOf("안","녕","하","세","요")
Observable.fromArray(*array)
.subscribe {
println(it)
}
}
결과
view raw RxJava.kt hosted with ❤ by GitHub

 

 

fromCallable

: 외부 함수로부터 데이터를 발행하는 스트림을 만듭니다.

fun main(){
var cnt = 0
val observable = Observable.fromCallable {
makeName(cnt++)
}
Thread.sleep(1000)
observable.subscribe { println(it) }
Thread.sleep(1000)
observable.subscribe { println(it) }
}
fun makeName(num: Int): String =
when (num) {
0 -> "예티"
1 -> "제프"
2 -> "루트"
else -> "마리"
}
결과
예티
제프
view raw RxJava.kt hosted with ❤ by GitHub

 

 

fromIterable

: iterable을 상속받은 list, set 등의 스트림을 만듭니다. 결과의 순서가 뒤죽박죽인 이유는 Set 콜렉션은 순서가 정해져 있지 않기 때문에 항상 순서가 변경됩니다.

fun main(){
val set: HashSet<String> = hashSetOf("안","녕","하","세","요")
Observable.fromIterable(set)
.subscribe {
print(it)
}
}
결과
안하세요녕
view raw RxJava.kt hosted with ❤ by GitHub

 

반응형

'안드로이드 > RxJava' 카테고리의 다른 글

Cold Observable vs Hot Observable  (0) 2023.01.25
[안드로이드] RxJava - 변환 연산자  (0) 2022.04.06
[안드로이드] RxJava 연산자 종류  (0) 2022.03.31
Observable에 관해서..  (0) 2021.06.08
RxJava란?  (0) 2021.06.08