Kotlin 比 Java 更方便的地方,其中之一是可以将函数作为参数。 上面三者都是将函数作为其它函数的参数来使用,其形式虽然简单,但理解并不简单。
(顺便吆喝一句,民族企业核心部门年底前的一波岗,base 武汉、深圳、苏州等地,前、后端 or 测试>>>机会;语言:Java、Js、测试、python、ios、安卓、C++ 等!
一、共同点 三者的返回值相同,均为 Unit,即没有返回值。 当然有返回值也可以,比如返回一个泛型 R,或者是一个具体的值 Int 等 如:
T.()->R、 ()->R、(T) -> R
或者:
T.()->Int、 ()->Int、(T) -> Int
二、定义形式 可以结合 Kotlin 自带的作用域函数来理解:
apply:
fun T.apply(block: T.() -> Unit): T { block(); return this }
also:
fun T.also(block: (T) -> Unit): T { block(this); return this }
自定义一个使用 ()->Unit 的例子
inline fun <T> T.doWithTry(block: () -> Unit) {
try {
block()
} catch (e: Throwable) {
e.printStackTrace()
}
}
三、使用
//定义了一个Person类
class Person(val name:String){
var age:Int = 0
var sex:Int = 0
}
fun test() {
val person= Person("张三")
person.also {
//没有指定参数名字,必须用it代指参数
it.age = 20 //it不能省略
it.sex = 0 //it不能省略
}
//或者
person.also {personValue->
//使用指定的参数名,同样personValue不能省略
personValue.age = 20
personValue.sex = 0
}
person.apply {
//直接访问Person的属性
this.age = 20 //this可以省略
this.sex = 1 //this可以省略
}
person.doWithTry{
//只能通过外部变量来访问Person
person.age = 20
person.sex = 1
}
}
上面的例子说明了以下几点: 1、T.()->Unit 的函数体中可以直接使用 T 代表的对象,即用 this 代表对象 2、(T) -> Unit 将 T 表示的对象作为实参通过函数参数传递进来,供函数体使用 3、 ()->Unit 与 T 表示的对象没有直接联系,只能通过外部 T 实例的变量来访问对象
四:可以这样理解: T.()->Unit 相当于是给类 T 定义了一个扩展函数,该函数没有形参,没有返回值,当然我们也可以增加参数与返回值,道理是一样的。
正是因为 T.() 为 T 的扩展函数,所以可以在函数体里直接访问 T 对象的属性或者成员函数。
(T) -> Unit 与 ()->Unit 只是一个普通的函数,一个带有参数,类型为 T,另一个没有参数而已。
(T) -> Unit 在使用 it 表示实参,是 Lambda 表达式所规定。
作者:竖起大拇指 链接:https://www.jianshu.com/p/fdf21e70777c 来源:简书