[RxJava] 조합 연산자(Combining Operators)

2021. 4. 9. 12:15·Android/RxJava
반응형

조합 연산자는 두개의 데이터를 조합해서 새로운 Observable을 만드는 연산자입니다.

combineLatest

combineLatest 마블다이어그램

combineLatest는 두개의 Observable에서 각각 데이터가 생성될 때 데이터를 조합해서 전달하는 연산자입니다.

첫 데이터는 두개의 Observable에서 모두 데이터가 생성됐을 때 전달이 되고, 그 이후에는 각각의 Observable에서 데이터가 생성 될 때 데이터를 조합해서 전달합니다. 예를 들면, Validation Check를 할 때에 사용할 수 있습니다.

fun main() {

    //combineLatest
    val observable3 = Observable.interval(1000L, TimeUnit.MILLISECONDS)
    val observable4 = Observable.interval(750L, TimeUnit.MILLISECONDS)

    val combineObservable = Observable.combineLatest<Long, Long, String> (
        observable3,
        observable4,
        BiFunction<Long, Long, String> { t1, t2 ->
            "$t1 $t2"
        }
    )
    combineObservable.subscribe {
        println(System.currentTimeMillis())
        println(it)
    }
    Thread.sleep(3000)
}

실행결과

combineLatest 실행결과

merge

merge 마블다이어그램

merge는 두개의 Observable을 합쳐서 하나의 Observable로 만들 수 있는 연산자입니다.

fun main() {
	val observable1 = Observable.interval(0, 1000L, TimeUnit.MILLISECONDS).map {"Observable 1 -> $it"}
    val observable2 = Observable.interval(0, 500L, TimeUnit.MILLISECONDS).map {"Observable 2 -> $it"}

    val mergeObservable = Observable.merge(observable1, observable2)

    mergeObservable.subscribe {
        println(System.currentTimeMillis())
        println(it)
    }
    
    /*
    // mergeWith
    observable1.mergeWith(observable2).subscribe {
        println(System.currentTimeMillis())
        println(it)
    }*/
    
    Thread.sleep(3000)   
}

실행결과

merge 실행결과

concat

concat은 merge와 마찬가지로 두개의 Observable을 합치지만 순서를 보장합니다.

여기서 순서를 보장한다는 말은, 앞의 Observable이 종료될 때 까지 뒤의 Observable이 데이터의 방출을 기다리고, 앞의 Observable이 종료되면 뒤의 Observable의 방출을 시작한다는 의미입니다.

fun main() {

	val observable1 = Observable.interval(0, 1000L, TimeUnit.MILLISECONDS).map {"Observable 1 -> $it"}
        .take(3000L, TimeUnit.MILLISECONDS)
    val observable2 = Observable.interval(0, 1000L, TimeUnit.MILLISECONDS).map {"Observable 2 -> $it"}

    Observable.concat(observable1, observable2)
        .doOnNext {
            println("observable: $it")
        }
        .subscribe({

        }, {

        })
    
	/*
    // concatWith
    observable1.concatWith(observable2)
        .doOnNext {
            println("observable: $it")
        }
        .subscribe({

        }, {

        })*/
        
    Thread.sleep(7000L)
}

실행결과

startWith

startWith 마블다이어그램

startWith는 Observable에 첫번째 데이터를 추가하는 연산자입니다.

fun main() {

    //startWith
    Observable.just(1,2,3,4,5)
        .startWith(100)
        .subscribe { println(it)}
}

실행결과

startWith 실행결과

zip

zip 마블다이어그램

 

zip은 각각의 Observable 데이터의 순서에 맞춰서 조합하는 연산자입니다.

두개의 Observable의 데이터가 모두 들어와야 데이터를 방출합니다.

fun main() {

    //zip
    val observable7 = Observable.just(1, 2, 3, 4, 5,6,7)
    val observable8 = Observable.just("a", "b", "c", "d", "e")

    val zipObservable = Observable.zip(
        observable7,
        observable8,
        BiFunction<Int, String, String> { t1, t2 ->
            "$t1 $t2"
        }
    )
    zipObservable.subscribe { println(it)}
}

실행결과

zip 실행결과

반응형
'Android/RxJava' 카테고리의 다른 글
  • [RxJava] flatMap의 원리 및 Observable 스트림 종료 후 다시 이어가기
  • [RxJava] RxJava retryWhen으로 예외발생시 일정시간 간격으로 재시도 처리하기(retryWithDelay)
  • [RxJava] 분류 연산자(Filtering Operators)
  • [RxJava] 변환 연산자(Transforming Operators)
seunghwaan
seunghwaan
공부한 내용을 정리하는 개발 기록 블로그
    반응형
  • seunghwaan
    SH's Devlog
    seunghwaan
  • 전체
    오늘
    어제
    • 분류 전체보기 (148) N
      • Android (62)
        • Basic (17)
        • Kotlin(Java) (14)
        • UI & Animation (1)
        • Compose (2)
        • Coroutines (1)
        • Dependency Injection (6)
        • RxJava (8)
        • BLE (3)
        • TDD (2)
        • JetPack (1)
        • NextStep (4)
        • Error Log (3)
      • Flutter (14)
        • Basic (5)
        • Dart (1)
        • State Management (2)
        • Widgets (4)
        • Error and Tips (2)
      • iOS (8)
        • Basic (0)
        • Swift (8)
      • Web Frontend (4) N
        • JavaScript(TS) (4) N
        • React (0)
      • CS(Computer Science) (18)
        • Network (4)
        • Database (10)
        • Design Pattern (1)
        • Computer Architecture (3)
        • Operating System (0)
      • Cloud (6)
        • AWS (6)
      • DevOps (25)
        • GIT (4)
        • CI CD (8)
        • Linux (4)
        • Docker (9)
        • Error Log (0)
      • 코딩테스트 (10)
        • DB (6)
        • 알고리즘 (4)
      • Backend (1)
        • Spring (1)
      • Mac Tip (0)
      • Language (0)
        • English (0)
        • Japanese (0)
      • Temporary (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Computer Science
    FLUTTER
    Dagger
    cs
    MySQL
    error
    Swift
    네트워크
    CI
    Algorithm
    컴퓨터공학
    di
    RxJava
    Network
    JavaScript
    Linux
    CICD
    AWS
    BLE
    database
    Jenkins
    시작하세요! 도커
    Android
    gradle
    Dependency Injection
    상태 관리
    cognito
    Kotlin
    docker
    IOS
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
seunghwaan
[RxJava] 조합 연산자(Combining Operators)
상단으로

티스토리툴바