小程序开发|小程序制作|小程序开发网

搜索

Kotlin中,理解T.()->Unit 、 ()->Unit与(T) -> Unit

2023-3-9 21:57| 发布者: yangyuan| 查看: 289| 评论: 0

摘要: Kotlin比Java更方便的地方,其中之一是可以将函数作为参数。上面三者都是将函数作为其它函数的参数来使用,其形式虽然简单,但理解并不简单。一、共同点三者的返回值相同,均为Unit,即没有返回值。当然有返回值也可

Kotlin比Java更方便的地方,其中之一是可以将函数作为参数。
上面三者都是将函数作为其它函数的参数来使用,其形式虽然简单,但理解并不简单。

一、共同点

三者的返回值相同,均为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.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表达式所规定。


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

鲜花

握手

雷人

路过

鸡蛋

最新评论

返回顶部