public void doStudy(Study study) {
study.readBoos();
study.doHomeWork();
}
观察以上代码 可能会出现空指针异常 因为study没有做任何的判空处理
解决办法:
public void doStudy(Study study) {
if (study != null) {
study.readBoos();
study.doHomeWork();
}
}
转为kotlin格式
fun doStudy(study: Study){
study.readBoos()
study.doHomeWork()
}
这时我们调用这个方法传null肯定是会报错的 不能传空 这时我们要传null该怎么办
现在是可以传null,但是下面的还是有问题的 那就继续修改
现在这段代码是没问题了 但是这样写甚至比java还要繁琐 所以还有肯定还得有其他的写法
判断是否为空的辅助类 简化以上代码
if (study != null) {
study.readBoos()
study.doHomeWork()
}
简化后(与上面一样 极大简化了代码 可以直接省略掉if的判断)
study?.readBoos()
study?.doHomeWork()
操作符 ?:
类似于三目表达式
看以下代码
val c = if(a != null){
a
}else{
b
}
使用操作符简化后
val c = a ?: b
如果a不为空 c = a 否则 c = b
获取text文本的字符个数
fun getTextLenghts(text: String?): Int {
if (text != null) {
return text.length
}
return 0
}
使用操作符简化
fun getTextLenghts(text: String?): Int {
return text?.length ?: 0
}
还有一种情况,就是本身已经判断是否为空了,但是kotlin中的空指针检查机制却还是给我们提示了某个地方可能为空,编译不通过 这个时候想强制执行某段代码就要使用 !! 来进行操作,这是一种具有风险的写法,意思就是不在使用kotlin中的空指针检查机制,即使出现了空指针的情况也需要自己处理
小结
? 判空 如果为空不执行以下代码
?: 如果为空执行后面一段代码 不为空执行前面的代码
!! 强制执行某段代码 承担空指针风险
let函数
let函数不是什么操作符也不是什么关键字 它可以作为操作对象放入lambda式中进行操作
let函数可以代替对象进行更安全的操作 如下
stu = study study已经在执行let函数之前提前判空了 所以let函数里面的stu对象也是不可能为空的
接前面学习的lambda表达式特性 lambda表达式中只有一个参数时可以省略这个参数使用 it 来代替 故修改如下
字符串内嵌
${}
当只有一个参数的时候可以使用 $
举例 当我们要输出某个参数的具体值
一般可以这样
定义变量 : val a = 10
Log.d("TAG","a is "+ a)
字符串内嵌写法
Log.d("TAG","a is ${a}")
其中当大括号中只有一个变量时 可以省略掉大括号
Log.d("TAG","a is $a")
给参数设置默认值
fun callThisMethod(num: Int, name: String = "土豆") {
println("num is $num" + "name is $name")
}
如上图代码所示 给name设置了一个"土豆"的默认值 下面调用一下这个方法
callThisMethod(20)
现在只传递一个num相对应的20 也是不会报错的
出现下面这种情况
callThisMethod("20")
就会出现报错的问题 解决办法肯定是有的
指定参数传值
callThisMethod(num = 10, name = "西瓜")
这样就没有问题了 单独传一个num = 20 或者 name = "西瓜"(num设置默认值) 都是可以的