//Kotlin中泛型变换实现
class KtBase9<T>(val isMap: Boolean = false, val inputType: T) {
//模仿RxJava T是要变化的输入类型 R是变化后的输出类型
//调用map返回的类型是 R? == 有可能是R或者null
inline fun <R> map(mapAction: (T) -> R): R? = mapAction(inputType).takeIf { isMap }
// inline fun<R> map(mapAction:(T)->R):R?{
// return mapAction(inputType).takeIf { isMap }
// }
}
fun main(args: Array<String>) {
val p1 = KtBase9(isMap = false, inputType = 123)
// val p1 = KtBase9(true, 123) //第二种方式
val r = p1.map {
it
it.toString()//lambda 最后一行是返回值
"里面的it是:$it" //lambda 最后一行是返回值
}
//验证是否是此类型 与null
// val str1: String = "str1"
// val str2: String? = "str2"
println(r is String) //false
println(r is String?) //true
println(r ?: "r的值为null,isMap为false")
/**************************************/
val p2 = KtBase9(true, Persons("yuknight", 25))
val r2: Students? = p2.map {
// it
Students(it.name, it.age)
}
println("r2对象:$r2")//r2对象:Students(name=yuknight, age=25)
//map函数 模仿RxJava变换操作
val stu = map(Persons("yuknight", 24)){
Students(it.name, it.age)//lambda 最后一行是返回值
}
println("Persons对象转成了:$stu")//Persons对象转成了:Students(name=yuknight, age=24)
val r3 = map(123){
it.toString()
"map整个值为:[$it]" //lambda 最后一行是返回值
}
println(r3)//map整个值为:[123]
}
inline fun <I, O> map(inputType: I, isMap: Boolean = true, mapActionLambda: (I) -> O): O? =
if (isMap) mapActionLambda(inputType) else null
data class Persons(val name: String, val age: Int)
data class Students(val name: String, val age: Int)
Kotlin中泛型变换实现
最新推荐文章于 2023-12-15 07:51:12 发布