Kotlin的标准函数指的是Standard.kt文件中定义的函数,任何Kotlin代码都可以自由地调用所有标准函数。
1. let函数
1.1 简介
- let函数实际上是一个作用域函数,当需要去定义一个变量在一个特定的作用域范围内时,就可以使用let函数。
- let函数只接收一个 Lambda 参数,并且会在 Lambda 函数块中提供调用对象的上下文。
1.2 示例代码
//作用1:使用it替代object对象去访问其公有的属性 & 方法
object.let{
it.todo()
}
//作用2:配合?.操作符检查object空指针
//?.操作符表示object为空时什么都不做,object不为空时就调用let函数
object?.let{
it.todo()
}
//注:返回值是let函数里面最后一行,或者指定return
//函数中表示对象本身使用的是it关键字
2. with函数
2.1 简介
- with函数用于对同一个对象执行多次操作而不需要反复把对象的名称写出来。
- with函数接收两个参数:第一个参数可以是一个任意类型的对象,第二个参数是一个 Lambda 函数块。 with 函数会在 Lambda 函数块中提供第一个参数对象的上下文。
2.2 示例代码
val result = StringBuilder()
result.append("apple")
result.append("banner")
for(letter in 'A'..'Z'){
result.append(letter)
}
println(result.toString())
//改为通过with函数来构建的话代码就会简洁许多
val result = with (StringBuilder()) {
append("apple")
append("banner")
for(letter in 'A'..'Z'){
append(letter)
}
toString() //with函数的返回值
}
println(result)
//注:返回值是with函数里面最后一行,或者指定return
//函数中表示对象本身使用的是this关键字
在这个例子中两个参数就是StringBuilder()和一个Lambda函数块,这里利用了把Lambda函数块放在括号外的约定。
3. run函数
3.1 简介
- run函数实际上可以说是let和with函数两个函数的结合体。
- run 函数只接收一个 Lambda 参数,并且会在 Lambda 函数块中提供调用对象的上下文。
3.2 示例代码
val result = StringBuilder()
result.append("apple")
result.append("banner")
for(letter in 'A'..'Z'){
result.append(letter)
}
println(result.toString())
//只是将调用with函数并传入StringBuilder()对象改成了调用StringBuilder()对象的run方法
val result = StringBuilder().run{
append("apple")
append("banner")
for(letter in 'A'..'Z'){
append(letter)
}
toString() //run函数的返回值
}
println(result)
//注:返回值是run函数里面最后一行,或者指定return
//函数中表示对象本身使用的是this关键字
4. apply函数
4.1 简介
apply 函数和 run 函数也是极其类似的,都要在某个对象上调用,并且只接收一个 Lambda 参数。也会在 Lambda 函数块中提供调用对象的上下文,但是 apply 函数无法指定返回值,而是会自动返国调用对象本身。
4.2 示例代码
val result = StringBuilder().apply{
append("apple")
append("banner")
for(letter in 'A'..'Z'){
append(letter)
}
}
println(result.toString())//最终返回一个StringBuilder()对象,得调用它的toString()方法才能打印
//注:返回值是object对象的本身
//函数中表示对象本身使用的是this关键字
5. also函数
5.1 简介
also函数和let函数很像,在Lambda函数块内通过 it 指代该对象。不同点就是let函数最后的返回值是最后一行的返回值而also函数的返回值是返回当前的这个对象(这一点和apply函数很像)。
5.2 示例代码
val result = StringBuilder().also{
it.append("apple")
it.append("banner")
for(letter in 'A'..'Z'){
it.append(letter)
}
}
println(result.toString())//最终返回一个StringBuilder()对象,得调用它的toString()方法才能打印
//注:返回值是object对象的本身
//函数中表示对象本身使用的是it关键字