rxjava 는 리액티브 프로그래밍(Reactive Programming) 을 구현하는데 사용되는 라이브러리입니다. 비동기 처리에 최적화되어있으며 함수형 프로그래밍의 영향을 받아  함수형 인터페이스를 인자로 전달 받고 처리가 이루어지는 특징을 가지...

[안드로이드] RxJava2 functions (함수형 인터페이스)

 


rxjava 는 리액티브 프로그래밍(Reactive Programming) 을 구현하는데 사용되는 라이브러리입니다.

비동기 처리에 최적화되어있으며 함수형 프로그래밍의 영향을 받아 

함수형 인터페이스를 인자로 전달 받고 처리가 이루어지는 특징을 가지고 있습니다.

rxjava 에서 정의된 함수형 인터페이스에 대해 어떤 것들이 있는지 살펴보고

rxjava 1.x 와 2.x 버전을 비교해서 정리 하려고 합니다.

 

 

 

1. RxJava 함수형 인터페이스 종류

RxJava 에서 사용되는 함수형 인터페이스는 아래와 같습니다.

 

RxJava 1.x, 2.x 네이밍만 변경됐을 뿐 동작은 똑같다고 보시면 됩니다.

끝으로 RxJava 1.x, 2.x 각각 함수형 인터페이스 사용해보는 예제로 마무리하겠습니다.

크게 return 값이 없는 Action 과 return 값이 있는 Function 으로 분류해서 보면 좋을 것 같습니다.



2. Action (return X)

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)

// RxJava1 - Action
val action0 = Action0 { Log.d("rxjava1", "action0") }
val action1 = Action1<Int> { Log.d("rxjava1", "action1 $it") }
val action2 = Action2<Int, Int> { t1, t2 -> Log.d("rxjava1", "action2 $t1, $t2") }

action0.call()
action1.call(1)
action2.call(1, 2)

// RxJava2 - Action
val action = Action { Log.d("rxjava2", "action") }
val consumer = Consumer<Int> { Log.d("rxjava2", "consumer $it") }
val biConsumer = BiConsumer<Int, Int> { t1, t2 -> Log.d("rxjava2", "biConsumer $t1, $t2") }

action.run()
consumer.accept(1)
biConsumer.accept(1, 2)
}

 

결과

D/rxjava1: action0
D/rxjava1: action1 1
D/rxjava1: action2 1, 2
D/rxjava2: action
D/rxjava2: consumer 1
D/rxjava2: biConsumer 1, 2

 

 

3. Fucntion (return O)

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)

// RxJava1 - Function
Log.d("rxjava1", func1().call(1))
Log.d("rxjava1", func2().call(1, 2))

// RxJava2 - Function
Log.d("rxjava2", function().apply(1))
Log.d("rxjava2", biFunction().apply(1, 2))
}

 

private fun func1(): Func1<Int, String> {
return Func1 { "func1 $it" }
}

private fun func2(): Func2<Int, Int, String> {
return Func2 { t1, t2 -> "func2 $t1, $t2" }
}

private fun function(): Function<Int, String> {
return Function { "function $it" }
}

private fun biFunction(): BiFunction<Int, Int, String> {
return BiFunction { t1, t2 -> "biFunction $t1, $t2" }
}

 

결과

D/rxjava1: func1 1
D/rxjava1: func2 1, 2
D/rxjava2: function 1
D/rxjava2: biFunction 1, 2

 

 

[참고자료]

란테의 펀드로이드

YunzaiDev

GWAN IT Blog



0 comments: