学逆向论坛

找回密码
立即注册

只需一步,快速开始

发新帖

1177

积分

0

好友

149

主题
发表于 前天 11:11 | 查看: 31| 回复: 0
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
来源:简书

温馨提示:
1.如果您喜欢这篇帖子,请给作者点赞评分,点赞会增加帖子的热度,评分会给作者加学币。(评分不会扣掉您的积分,系统每天都会重置您的评分额度)。
2.回复帖子不仅是对作者的认可,还可以获得学币奖励,请尊重他人的劳动成果,拒绝做伸手党!
3.发广告、灌水回复等违规行为一经发现直接禁言,如果本帖内容涉嫌违规,请点击论坛底部的举报反馈按钮,也可以在【投诉建议】板块发帖举报。

小黑屋|手机版|站务邮箱|学逆向论坛 ( 粤ICP备2021023307号 )|网站地图

GMT+8, 2025-12-13 19:11 , Processed in 0.099530 second(s), 35 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表