Kotlin标准库中提供了几个函数供我们快速调用,极大地提高了开发效率,下面可以了解学习一下
看了网上的文章,都是讲解的十分复杂,把源码也是讲了进去,让基础的人十分云里雾里的
所以,本篇重点讲怎么用,至于原理,可能后面单独出篇文章进行补充说明
let与run
let与run,都可以代码块中返回任意类型的对象(及最后一行写个对象即可,不需要return
关键字),唯一不同的是,let中的代码块用it
代表其对象本身,run
则是用this
来代替其本身
var str : String? = "x"
val result = str?.let {
println(it)
println(it.length)
//任意对象都行,无需return关键字
"result"
}
val result1 = str?.run {
println(this)
println(length)
"result"
}
also与apply
also与apply
与上面那组的区别,即不能在代码块中返回对象,但其函数是返回对象本身
当然,你用上面那组let与run
在结尾返回本身也是可以的,好像也没有啥规定,唯一的影响可能是代码多了行,影响了代码可读性..
also
与let
类似,代码块中是it
代表本身apply
与run
类似,代码块中是this
代表本身
var str : String? = "x"
val result = str?.also {
//这里不能在最后一行写个对象用于返回
}
val result1 = str?.apply {
//这里不能在最后一行写个对象用于返回
}
println(result) //输出为x
println(result1)//输出为x
方法名 | 代替其本身 | 返回结果类型 |
---|---|---|
let | it | R |
run | this | R |
also | it | Unit |
apply | this | Unit |
PS:R代表任意类型的对象
使用情形
使用情形的话可以根据上面的表格进行分析
let的话适合需要使用到对象自身的逻辑,之后代码块返回某个对象
val stringBuffer = StringBuffer()
val result = stringBuffer.also {
it.append("hello")
it.append("xx")
it.toString()
}
run的话与let类似,不过其适合需要多次使用到对象自身的逻辑,因为this可以省略,所以可以让给代码看起来比较简略,之后代码块返回某个对象
also的话适合需要使用对象自身,需要对自身对象进行相关的修改,且之后也是需要自身
val stringBuffer = StringBuffer()
stringBuffer.also {
it.append("hello")
it.append("xx")
}
//下面还是需要stringBuffer这个对象
println(stringBuffer.toString())
apply与also类似,只是由于在代码块中是this,所以默认可以省略,这样看起来比较简略,适合代码块中需要多次使用到自身对象的逻辑
repeat,takeIf,with
repeat
repeat正如其名,是用来循环次数的,比如说我们需要执行10次某段代码,一般来说是想到for循环,而kotlin中比较人性化地考虑到了这点,我们可以直接使用repeat来达到与for循环一样的效果
//下面的代码循环3次输出,输出0 1 2
repeat(3) {
//it同等于for循环中的i,从0开始
println(it)
}
takeIf
满足代码块中的条件,返回调用对象,否则返回为null,如下面代码:
val num = 4
//判断4是否能被2整除,能的话,得到4这个数值
val result = num.takeIf { num%2==0 }
println(result)
PS:takeUnless
与takeIf
相反
with
与run差不多,可以在代码块中省略this,返回任意类型的数值,不同的是with在如何地方都可以调用,前面无需通过对象.
的方式调用,如下面例子:
val result = with(StringBuffer()) {
append("hhelo")
append("xx")
toString()
}.replace("xx","")
println(result)
with比较适合那种使用匿名对象的相关逻辑,利用匿名对象的相关方法,处理完逻辑,之后就把该匿名对象丢弃
其他补充
省略?
判空
Kotlin中使用?进行判空处理,当一个对象可为null,IDE检查的语法就会不通过,我们必须写上?.
这种方式才能让语法通过
其实,我们可以使用上述的let、run、apply和also**(本文列出的其他函数并未作尝试)**来进行判空验证,从而避免进行过多的写?.
如有这样一个例子:
val stringBuffer: StringBuffer? = null
//这里必须使用?.
stringBuffer?.append("hello")
stringBuffer?.append("xx")
上面的情况还好说,如果是多一点的话,我们都要写上?
,岂不是要烦死?于是我们可以这样写:
val stringBuffer: StringBuffer? = null
stringBuffer?.apply {
append("hello")
append("xx")
}
评论区