Kotlin中,理解T.()->Unit 浅浮、 ()->Unit與(T) -> Unit

Kotlin比Java更方便的地方,其中之一是可以將函數(shù)作為參數(shù)捷枯。
上面三者都是將函數(shù)作為其它函數(shù)的參數(shù)來使用滚秩,其形式雖然簡單,但理解并不簡單铜靶。
一叔遂、共同點
三者的返回值相同,均為Unit争剿,即沒有返回值已艰。
當(dāng)然有返回值也可以,比如返回一個泛型R蚕苇,或者是一個具體的值Int等
如:

T.()->R哩掺、 ()->R、(T) -> R
或者:
T.()->Int涩笤、 ()->Int嚼吞、(T) -> Int

但是這不是重點,要理解三者蹬碧,主要是分析前面的部分舱禽,這里返回Unit只是為了方便理解。
二恩沽、定義形式
可以結(jié)合Kotlin自帶的作用域函數(shù)來理解:
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 {
        //沒有指定參數(shù)名字,必須用it代指參數(shù)
        it.age = 20   //it不能省略
        it.sex = 0    //it不能省略
    }
    //或者
    person.also {personValue->
        //使用指定的參數(shù)名,同樣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 的函數(shù)體中可以直接使用T代表的對象里伯,即用this代表對象
2、(T) -> Unit 將T表示的對象作為實參通過函數(shù)參數(shù)傳遞進(jìn)來渤闷,供函數(shù)體使用
3疾瓮、 ()->Unit與T表示的對象沒有直接聯(lián)系,只能通過外部T實例的變量來訪問對象

四飒箭、理解
T.()->Unit 中用this代表對象狼电,而this的使用一般是一個類的成員函數(shù)中用來表示該類的實例對象本身蜒灰,比如,為Person類加一個函數(shù):

class Person(val name:String){
    var age:Int = 0
    var sex:Int = 0
   
    fun info(){
        //此函數(shù)中用this表示了當(dāng)前的Person對象肩碟,this可以省略
        println("age is ${this.age},sex is ${if(sex == 0) "女" else "男"}")
    }
}

所以我們可以這樣理解卷员,T.()->Unit相當(dāng)于是給類T定義了一個擴展函數(shù),該函數(shù)沒有形參腾务,沒有返回值,當(dāng)然我們也可以增加參數(shù)與返回值削饵,道理是一樣的岩瘦。
正是因為T.()為T的擴展函數(shù),所以可以在函數(shù)體里直接訪問T對象的屬性或者成員函數(shù)窿撬。

(T) -> Unit與 ()->Unit只是一個普通的函數(shù)启昧,一個帶有參數(shù),類型為T劈伴,另一個沒有參數(shù)而已密末。
(T) -> Unit在使用it表示實參,是Lambda表達(dá)式所規(guī)定

//Lambda表達(dá)式形式
person.also {
    //沒有指定參數(shù)名字,必須用it代指參數(shù)
    it.age = 20   //it不能省略
    it.sex = 0    //it不能省略
}

//不使用Lambda表達(dá)式的原始形式
person.also(
      //定義了一個匿名函數(shù)严里,符合also的參數(shù)要求
      //it為參數(shù)名,可以更改成其它任何符合要求的名稱
     fun(it:Person){
        //由also函數(shù)的定義可知追城,person對象會通過形參it傳給匿名函數(shù)
        it.age = 20
        it.sex = 0
     }
)

五刹碾、總結(jié)
1座柱、()->Unit與(T) -> Unit是相同的色洞,只是一個帶參,一個不帶參
(T) -> Unit通過形參T可將對象作為實參傳給函數(shù)锦针,所以函數(shù)體里能通過it或者指定名稱的方式來訪問該對象

2伞插、T.()->Unit 等同于為T定義了一個無參數(shù)的擴展函數(shù)媚污,所以在函數(shù)體內(nèi)可以直接通過this或省略來訪問T代表的對象

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市廷雅,隨后出現(xiàn)的幾起案子耗美,更是在濱河造成了極大的恐慌京髓,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件商架,死亡現(xiàn)場離奇詭異堰怨,居然都是意外死亡,警方通過查閱死者的電腦和手機蛇摸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進(jìn)店門备图,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人赶袄,你說我怎么就攤上這事揽涮。” “怎么了饿肺?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵蒋困,是天一觀的道長。 經(jīng)常有香客問我敬辣,道長雪标,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任溉跃,我火速辦了婚禮村刨,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘喊积。我一直安慰自己烹困,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布乾吻。 她就那樣靜靜地躺著髓梅,像睡著了一般。 火紅的嫁衣襯著肌膚如雪绎签。 梳的紋絲不亂的頭發(fā)上枯饿,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天,我揣著相機與錄音诡必,去河邊找鬼奢方。 笑死,一個胖子當(dāng)著我的面吹牛爸舒,可吹牛的內(nèi)容都是我干的蟋字。 我是一名探鬼主播,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼扭勉,長吁一口氣:“原來是場噩夢啊……” “哼鹊奖!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起涂炎,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤忠聚,失蹤者是張志新(化名)和其女友劉穎设哗,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體两蟀,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡网梢,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了赂毯。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片战虏。...
    茶點故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖党涕,靈堂內(nèi)的尸體忽然破棺而出活烙,到底是詐尸還是另有隱情,我是刑警寧澤遣鼓,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站重贺,受9級特大地震影響骑祟,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜气笙,卻給世界環(huán)境...
    茶點故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一次企、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧潜圃,春花似錦缸棵、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至隧出,卻和暖如春踏志,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背胀瞪。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工针余, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人凄诞。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓圆雁,卻偏偏與公主長得像,于是被迫代替她去往敵國和親帆谍。 傳聞我的和親對象是個殘疾皇子伪朽,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,077評論 2 355

推薦閱讀更多精彩內(nèi)容