-
let内联扩展函数
作用与返回结果:
1.定义变量在一个特定的作用域范围内; 2.避免写一些判断null的操作 3.返回结果为let作用域中的最后一行或指定return表达式fun letTest(str:String?){ val result = str?.let{ println("str:it") //it的作用于范围就是let大括号内 1000 } println(result) } fun void main(){ letTest(null) //最终打印为null letTest("test") //打印出 str:test和1000 } -
with内联函数
作用和返回结果:
1.with它不是以扩展的形式存在的,它是将某个对象作为函数的参数,在函数块中this指代该对象 2.返回值为函数块的最后一行或指定return表达式data class User(var name:String? = null) fun withTest(user:User){ val result = with(user){ println("my name is $name") 1000 } println(result) } fun main(){ val user = User("test") withTest(user) //打印 my name is test 和 1000 } -
run内联扩展函数
作用和返回结果
1.run函数实际上可以说是let和with两个函数的集合体 2.run函数只接受一个lambda函数为参数,以闭包形式返回 3.返回值为最后一行的值或者指定的return的表达式data class User(var name:String? = "",var age:Int? = 10) fun main(){ val list = listOf(User("张三",15), User("李四",20), User("lily"), null) list.forEach{ it?.let{ with(it){ println("this is $name,age is $age") } } } list.forEach{ it?.run{ println("this is $name,age is $age") } } } -
apply内联扩展函数
作用和返回值
1.apply与run函数很相似,唯一不同点就是他们各自返回的值不一样,run返回最后一行代码的值,二apply函数返回的是传入的对象的本身data class Person(var name:String?,var age:Int?) fun main(){ val person = Person() person.apply{ name="李四" }.apply{ age = 50 } println("this is ${person.name},age is ${person.age}") //最终打印为:this is 李四,age is 50 } -
also内联扩展函数
作用和结果
1.also和let的区别就是返回值不一样,let是以闭包的形式返回,返回函数体内最后一行的值,如果最后一行为空就返回一个Unit类型的默认值,而also函数返回的则是传入对象的本身fun main(){ val result = "test".also{ println(it.length) } println(result) //打印 4和test }总结
- let适用于处理不为null的操作场景
- with 适用于调用同一个类的多个方法时,可以省去类名重复,直接调用类的方法即可,经常用于Android中RecyclerView中的onBindViewHolder,数据model的属性映射到UI上
- run适用于let,with函数任何场景
- apply适用于run函数的任何场景,一般用于初始化一个对象实例的时候,操作对象属性,并最终返回这个对象,如:动态infalte出一个XML的View的时候需要给View绑定数据会用到,多个扩展函数链式调用会用到,数据model多层级包裹判空处理的问题也会用到
- also适用于let函数的任何场景,一般可用于多个扩展函数链式调用