How to transform Observables
from one type to another?
Say for example, a function is returning an observable of a list of strings, which are basically numbers. But, you finally need an observable of list of integers, and each of them need to be multiplied by 2, for some weird reason.
fun getStringList(): Observable<List<String>> {
return Observable.just(listOf("1", "2", "3", "4"))
}
and you need to write a function like this.
fun getIntList(): Observable<List<Int>> {
// ...
}
To achieve this, let’s write a mapper class template.
abstract class Mapper<T1, T2>() {
abstract fun map(value: T1): T2
}
And to actually carry out the transformation, let’s write another concrete class which extends the Mapper
class.
class StringToIntMapper : Mapper<List<String>, List<Int>>() {
override fun map(value: List<String>): List<Int> {
val out = ArrayList<Int>()
value.forEach {
out.add(Integer.parseInt(it) * 2)
}
return out
}
}
The above class, takes in the value
of type List<String>
and converts it to a List<Int>
.
And finally, to complete the transformation, use the above class in your function.
fun getIntList(): Observable<List<Int>> {
return getStringList().map { StringToIntMapper().map(it) }
}