学习kotlin的一些笔录7

17.let函数,提供函数式API编程接口,将原始调用对象作参数传递给lambda,ef:

//此处的obj和obj2实际为同一对象,下面这样写只为防止重名区分而已
obj.let { obj2 ->
    // 编写具体的业务逻辑
}

现在我们用 let函数来配合?.操作符 为空值检测来看看它的大作用,来看看一些示范,ef:

//引用上一章的方法https://blog.csdn.net/lwh1135275334/article/details/127285069?spm=1001.2014.3001.5501
fun doStudy(study: Study?) {
    study?.readBooks()
    study?.doHomework()
}
//显然这样在逻辑理解上有点啰嗦,将它实质翻译成if判断其实为下
fun doStudy(study: Study?) {
    //本来从逻辑上应一次if非空判断即可,但由于受?.操作符限制,变成了每次都非空判断
    if (study != null) {
        study.readBooks()
    }
    if (study != null) {
        study.doHomework()
    }
}
//这时用let函数配合?.操作符进行优化
fun doStudy(study: Study?){
    study?.let { stu ->
        stu.readBooks()
        stu.doHomework()
    }
}
//当lambda中只有一参时,可将参数用it取代,最终简化
fun doStudy(study: Study?){
    study?.let {
        it.readBooks()
        it.doHomework()
    }
}

注意:let函数 可处理全局变量判空问题,但if判断不可,下面报错的原因:由于全局变量随时可被其他线程更改,无法保证判断中的study变量不存在空值风险。由此可看出let函数的优势,ef:

 18.字符串内嵌表达式

kt允许在字符串中内嵌${}表达式,用作运行结果替代部分内容(相当于优化java中字符串拼接):

//java的字符串拼接
println("hello," + name + ". nice to meet you!")
//kt优化后的内嵌表达式
println("hello, ${obj.name}. nice to meet you!")
//kt,内嵌表达式中仅有一个变量时(如非集合类变量),可省括号
println("hello, $name. nice to meet you!")

19.函数参数设默认值

在之前的学习中学习kotlin的一些笔录 2_嗷喵喵没有吃鱼的博客-CSDN博客,次构造其实在kt中很少用,很大程度上被 函数参数设默认值 所代替,ef:

//可看出第二个参数设定了默认值
fun printParams(num: Int, str: String = "hello") {
    println("num is $num , str is $str")
}

fun main() {
    //方法调用中,第一函数必传参,但第二参数可传参,也可不传参
    printParams(123)
}

但上面示范显然过于理想化,最后参数正好设了默认值,若只让第一个num参数设默认值呢,模仿上面的写法是会报错类型不匹配,ef:

19.键值对传参

kotlin提供java所没有的特殊传参机制, 不必像传统写法那样按照顺序定义传参,只需键值对对应即可,例如调用printParams(),ef:

printParams(str = "world", num = 123)

根据键值对传参,可解决先前类型不匹配的问题,ef:

fun printParams(num: Int = 100, str: String) {
    println("num is $num , str is $str")
}

fun main() {
    //此时参数哪个在前哪个在后无所谓,kt会按照键值对匹配
    printParams(str = "world", num =200)
    //而使用这种键值对传参,num不传值也可了,即省略了
    printParams(str = "world")
}
//打印如下
num is 200, str is world
num is 100, str is world

学习了函数参数设默认值和键值对传参后,我们回到先前所说的kt的次构造很大程度被 函数参数设默认值  取代就很显而易见了,ef:

//回顾下当初学习次构造函数的代码,详细在https://blog.csdn.net/lwh1135275334/article/details/127212363?spm=1001.2014.3001.5501
class Student(val sno: String, val grade: Int, name: String, age: Int) :
         Person(name, age) {
    constructor(name: String, age: Int) : this("", 0, name, age) {
    }

    constructor() : this("", 0) {
    }
}
//下面只通过编写主构造,然后函数参数赋默认值来实现
class Student(val sno: String = "", val grade: Int = 0, name: String = "", age: Int = 0)
: Person(name, age){

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值