let扩展函数作用:1.实际上是一个作用域函数,2.可以避免写一些判空的操作
fun test(str : String?) {
str?.let {
println(str)
}
}
run 函数只接收一个lambda函数为参数,以闭包形式返回,返回值是最后一行代码的值或者指定的return表达式。在run函数中可以直接访问实例3的公有属性和方法。
class Person{ fun learn() { println("learn function") } companion object{ fun learn2() { println("伴生方法") } } } fun testLearn(person: Person): String { person.run { learn() println("sss") return "return line"//使用return 显示返回值,则在testLearn()需要相应的返回值类型 } }
apply函数:调用某个对象的apply函数,在函数作用域范围内,可以任意调用该对象的任意方法,并返回该对象。
apply函数和run函数相同点:各自都有返回值。不同点:run函数是闭包形式返回最后一行代码的值,而apply函数返回的是传入对象本身。
fun testApply() { ArrayMap<String, String>().apply { put("key1", "value1") put("key2", "value2") println(this) println("${this.size}") println("$this") }.let { println(it) } }
此外,apply函数一般用于对象实例的初始化时候,对对象中的属性进行赋值;或者动态inflate出一个xml的view时候,需要给view绑定数据时用到。