范围函数
1.1 定义:
Kotlin 标准库包含⼏个函数,它们的唯⼀⽬的是在对象的上下⽂中执⾏代码块。 当对⼀个对象调⽤这样的函数并提供⼀个 lambda 表达式时,它会形成⼀个临时作⽤域。
在此作⽤域中,可以访问该对象⽽⽆需其名称从而简化代码。 这些函数称为 作⽤域函数 。
1.2 种类:
共有以下五种:let 、run 、with 、apply 以及 also 。
这些函数基本上做了同样的事情:在⼀个对象上执⾏⼀个代码块。不同的是这个对象在块中如何使⽤,以及整个表达式的返回的结果是什么。
1.3 区别:
由于作⽤域函数本质上都⾮常相似,因此了解它们之间的区别很重要。每个作⽤域函数之间有两个主要区别:
1.引⽤上下⽂对象的⽅式
2.返回值
this -> 作为lambda表达式的接收者
{ it } 作为作为lambda表达式的参数
1.3.1 根据上下文分类
run 、with 以及 apply 将上下⽂对象作为接收者(this)。
let 、also 将上下⽂对象作为 lambda 表达式参数 (it)
1.3.2 根据返回值分类
apply 及 also 返回上下⽂对象
let 、run 及 with 返回 最后一行的lambda 表达式结果
根据引用上下文以及函数的返回值就可以确定函数使用的场景
如下例子会帮助你理解返回函数:
fun main(args: Array<String>) {
val user = User("小明", 18)
//返回age++的结果 上下文是 user作为参数it
var ageNew = user.let {
it.name = "小红"
++it.age
}
println("ageNew=$ageNew")
//返回的是 user 本身, lambda 表达式范围内的上下文就是user 可以看到我们调用age时无需用指明对象
var user1 = user.apply {
age++
}
println(user1.toString())
val numbers = mutableListOf("one", "two", "three")
val countEndsWithE = numbers.run {
add("four")
add("five")
count { it.endsWith("e") }
}
println("There are $countEndsWithE elements that end with e.")
var result = user.takeIf { it.name == "小红" }?.takeUnless { it.age != 20 }
println(result.toString())
swap()
}
//交换两个值
fun swap(){
var a = 1
var b = 2
a = b.apply { b = a }//return b;
println("a=$a ,b=$b")
}
学习心得:kotlin 对于会Java的同学来说学习曲线很平滑,只需要懂这些高阶函数,还用kotlin多提供的特性,或者特有的表现方式就算基本掌握了。不懂得一定要去看文档,读文档描述的最准确,最容易理解。然后在做一些练习便于以后复习和记忆。