kotlin在Standand.kt中定义了一些标准函数,方便程序员调用。
let
let函数的参数是一个lambda表达式,其调用格式如下:
obj1.let{obj2 -> 语句块}
这里的obj
与obj2
实际上是同一个对象,写的不一样是为了避免重名。
let函数最常见的应用时辅助判空。请看下面的例子
fun doStudy(study:Study)
{
study.read()
study.write()
}
此处doStudy
是一个函数,接收一个Study
类型的参数,其函数体也很简单,就是完成“阅读”和“写作”。但是上述问题有一个问题,就是参数不允许是空类型。即当主调函数传入的参数是null
时,编译器就会报错。为了解决这个问题,我们采用kotlin的可空类型,改进代码如下:
fun doStudy(study:Study?)
{
study?.read()
study?.write()
}
上述代码的确可行,但是显得比较啰嗦,因为他等价于每次执行study
的某个方法之前,都要进行判空操作。而事实上,我们连续执行了study
的两个方法,仅仅一次判空即可,可以借助let函数改进如下:
fun doStudy(study:Study?)
{
study.let{
it.read()
it.write()
}
}
此处,应用了lambda表达式的简化规则:当lambda中只有一个参数时,可省略之,并用it代替。
with
with
函数的作用是当连续调用同一个函数的多个方法时,让代码更加简洁。
with
函数接收两个参数,第一个参数是任意的对象,第二个参数是一个lambda表达式,lambda的最后一行作为with()
函数的返回值。请看下面的例子。
val letters = listOf<String>("A", "B", "C", "D", "E")
val builder = StringBuilder()
for(letter in letters)
{
builder.append(letter).append('\n')
}
val result = builder.toString()
println(result)
上面的一段代码将letters
中的字母逐个添加到builder中,并以换行符作为分隔,最后将builder的转成字符串赋值给result。
利用with
函数改写为如下的形式
val result = with(StringBuilder()){
for(letter in letters){
append(letter).append('\n')
}
toString()
}
println(result)
with
函数的第一个参数是一个StringBuilder
对象,并且此对象作为lambda的上下文。在lambda中调用该对象的方法时,不必写出完成的调用形式builder.append(letter)
,而是省略对象名,直接用方法名。最后一行代码toString()
作为with
函数的返回值赋值给result
。
run
run
方法与with
方法作用基本一致,只是在调用形式上做了微小改动。
run
的参数只有一个lambda表达式,且不能单独调用,只能作为对象的方法调用。此处的对象的作用相当于with
中的第一个参数,为后面的lambda表达式提供上下文。
上面的代码用run
方法改写如下。
val result = StringBuilder().run {
for(letter in letters)
{
append(letter).append('\n')
}
toString()
}
println(result)
apply
apply
函数与run
函数调用方法与作用都一样。唯一的区别是apply
无法指定返回值,而是直接返回调用此方法的对象本身。
用apply
方法改写上述代码如下
val result = StringBuilder().apply {
for (letter in letters)
{
append(letter).append('\n')
}
}.toString()
println(result)