Kotlin中泛型变换实现

这篇博客介绍了Kotlin中如何使用泛型和内联函数实现数据类型的变换,通过`KtBase9`类展示了如何在`map`函数中根据`isMap`标志决定是否进行转换。示例中包括了整数到字符串的转换以及`Persons`到`Students`的数据结构变换。此外,还提供了一个通用的`map`函数实现,用于根据指定条件进行变换操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//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)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yu-Knight

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值