Lift 연산자

연산자 오버로딩 하는 방법 줌 RxJava에서는 compose 와 lift 가 대표적으로 사용된다.

compose 는 전 내용에서 설명해놓은 내용이 있다.

그럼 lift는 차이점이 무엇인가.

Lift는 연산자를 오버로딩해서 새로 만드는 걸 목적으로 하며

compose는 여러 연산자를 하나의 연산자로 만드는게 주 목적이라고 생각된다.

우선 lift 구현 동작 부터 확인해보자.

interface ObservableOperator<Downstream, Upstream> {
/**
* Applies a function to the child Observer and returns a new
parent Observer.
* @PARAM observer the child Observer instance
* @return the parent Observer instance
* @THROWS Exception on failure
*/
@NonNull
@Throws(Exception::class)
fun apply(@NonNull observer: Observer<in Downstream>):
Observer<in Upstream>;
}

그럼 Lift 실제 사용법은 어떤지 확인해보자.

우선 예제 목적은 각각의 수에 앞에 번호를 붙어는 간단한 예제이다.

//T 형태의 내용을 받아서 Pair 로 변경해서 보내는 예제이다.
class AddSerialNumber<T> : ObservableOperator<Pair<Int , T>, T> {
override fun apply(observer: Observer<in Pair<Int, T>>): Observer<in T> {
val counter = AtomicInteger()

return object : Observer<T> {
override fun onSubscribe(d: Disposable) {
println("onSubscribe")
observer.onSubscribe(d)
}

override fun onNext(t: T) {
println("onNext")
observer.onNext( counter.incrementAndGet() to t)
}

override fun onComplete() {
println("onComplete #1")
observer.onComplete()
}

override fun onError(e: Throwable) {
println("onError #1")
observer.onError(e)
}

}
}
}
Observable.range(10,20)
.lift(AddSerialNumber<Int>()) //<-- 리프트 연산자 추가
.subscribeBy(
onNext = {
println("Next $it")
},
onError = {
it.printStackTrace()
},
onComplete = {
println("Completed")
}
)

==============================================
onSubscribe
onNext
Next (1, 10)
onNext
Next (2, 11)
onNext
Next (3, 12)
onNext
Next (4, 13)
onNext
Next (5, 14)
onNext
Next (6, 15)
onNext
Next (7, 16)
onNext
Next (8, 17)
onNext
Next (9, 18)
onNext
Next (10, 19)
onNext
Next (11, 20)
onNext
Next (12, 21)
onNext
Next (13, 22)
onNext
Next (14, 23)
onNext
Next (15, 24)
onNext
Next (16, 25)
onNext
Next (17, 26)
onNext
Next (18, 27)
onNext
Next (19, 28)
onNext
Next (20, 29)
onComplete #1
Completed

이런식으로 앞에 번호를 붙일수가 있다.

+ Recent posts