Kotlin-Learing Day3

空指针检查

以下代码不安全

public void doStudy(Study study){
	stduy.readbood()
	study.doHomework()
}

应该加一个判空条件判断

public void doStudy(Study study){
	if (study!=null)
	{
	stduy.readbood()
	study.doHomework()
	}
}

可空类型系统

这种情况在kotlin就可以避免

fun doStudy(study: Study){
	study.readBooks()
	study.doHomework()
}
//因为kotlin默认所有的参数和变量都不为空

也就是说,kotlin的判空机制提前到了编译时期,当我们的程序有存在空指针的异常时,编译器会直接报错。

但是如果我们需要指针为空那怎么办?

于是就有了可空类型系统,只需要在类名或者变量后加一个问号 **?**即可

fun main(){
	doStudy(null)
}
fun doStudy(study:Study?){
	study.readBooks()
	study.doHomework()
}//加问号后代表此变量可以为空

这时候就需要进行检查,也就是需要主动判空。

fun main(){
	doStudy(null)
}
fun doStudy(study:Study?){
	if (study!=null)
	{
	stduy.readBook()
	study.doHomework()
	}
}

判空辅助工具

  • 最常用的是**?.**

作用是当对象不为空时正常操作。当对象为空时什么都不做。

上面的代码可以改成

fun doStudy(study:Study?)
{
	study?.readBook()
	study?.doHomework()
}
  • 另一个常用的是 **?:**操作符,左右两边都接受一个表达式,如果左边不为空就返回左边表示的结果,否则就返回右边表达式的结果

val c=a?:b
  • 如果非常确信某对象不为空,应该使用**!!.**关键字

let函数

这个函数提供了函数式API的编程接口,并将原始对象作为参数传递到lambda表达式中

obj.let{ obj2 ->
//具体逻辑,这里的obj2是为了避免混淆,其实他跟obj是同一个对象
}

与判空结合起来可以这么写

fun doStudy(study:Study?){
	study?.let{
		stu-> stu.readBook()
			  stu.doHomework()
	}
}
//意思是当study不为空时将study作为参数传递到lambda中

另外,let语句可以处理全局变量的判空问题,但是if不行

其他小技巧

字符串内嵌表达式

什么是内嵌表达式呢?与之对应是java的字符串拼接。

val brand = "Samsung"
val price = 1299.99
println("Cellphone(brand="+brand+"",price="+price+")")

可以看到可读性非常差而且很费力,在kotlin中就不会有这种烦恼,可以直接在字符串内嵌表达式

val brand = "Samsung"
val price = 1299.99
println("Cellphone(brand=$brand,price=$price)")

语法规则如下

str = "hello ${obj.name}"
//只有一个变量时可以去掉括号
str = "hello $name"

函数的参数默认值

fun printParams(num:Int,str:String = "hello")
{
...}

直接在括号内修改即可。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值