Kotlin之let,apply,with,run函數(shù)區(qū)別

Kotlin之let,apply,with,run函數(shù)區(qū)別


重新整理

重新整理了各種函數(shù)的區(qū)別,請移步到這里


以下作廢


很長一段時間內(nèi)都一直使用Kotlin這門語言,也只是純粹使用簡單語法,最近有時候寫的代碼,編輯器自動提示使用let等函數(shù)革半,然后就專門花點時間研究了下。

let

首先let()的定義是這樣的流码,默認當前這個對象作為閉包的it參數(shù)又官,返回值是函數(shù)里面最后一行,或者指定return

fun <T, R> T.let(f: (T) -> R): R = f(this)

簡單示例:

fun testLet(): Int {
    // fun <T, R> T.let(f: (T) -> R): R { f(this)}
    "testLet".let {
        println(it)
        println(it)
        println(it)
        return 1
    }
}
//運行結果
//testLet
//testLet
//testLet

可以看看最后生成的class文件漫试,代碼已經(jīng)經(jīng)過格式化了赏胚,編譯器只是在我們原先的變量后面添加了let里面的內(nèi)容。

public static final int testLet() {
    String str1 = "testLet";
    String it = (String)str1;
    int $i$a$1$let;
    System.out.println(it);
    System.out.println(it);
    System.out.println(it);
    return 1;
}

來個復雜一定的例子

fun testLet(): Int {
    // fun <T, R> T.let(f: (T) -> R): R { f(this)}
    "testLet".let {
        if (Random().nextBoolean()) {
            println(it)
            return 1
        } else {
            println(it)
            return 2
        }
    }
}

編譯過后的class文件

public static final int testLet() {
    String str1 = "testLet";
    String it = (String)str1;
    int $i$a$1$let;
    if (new Random().nextBoolean())
    {
        System.out.println(it);
        return 1;
    }
    System.out.println(it);
    return 2;
}

apply

apply函數(shù)是這樣的商虐,調(diào)用某對象的apply函數(shù)觉阅,在函數(shù)范圍內(nèi),可以任意調(diào)用該對象的任意方法秘车,并返回該對象

fun <T> T.apply(f: T.() -> Unit): T { f(); return this }

代碼示例

fun testApply() {
    // fun <T> T.apply(f: T.() -> Unit): T { f(); return this }
    ArrayList<String>().apply {
        add("testApply")
        add("testApply")
        add("testApply")
        println("this = " + this)
    }.let { println(it) }
}

// 運行結果
// this = [testApply, testApply, testApply]
// [testApply, testApply, testApply]

編譯過后的class文件

  public static final void testApply()
  {
    ArrayList localArrayList1 = new ArrayList();
    ArrayList localArrayList2 = (ArrayList)localArrayList1;
    int $i$a$1$apply;
    ArrayList $receiver;
    $receiver.add("testApply");
    $receiver.add("testApply");
    $receiver.add("testApply");
    String str = "this = " + $receiver;
    System.out.println(str);
    localArrayList1 = localArrayList1;
    ArrayList it = (ArrayList)localArrayList1;
    int $i$a$2$let;
    System.out.println(it);
  }

with

with函數(shù)是一個單獨的函數(shù)典勇,并不是Kotlin中的extension,所以調(diào)用方式有點不一樣叮趴,返回是最后一行割笙,然后可以直接調(diào)用對象的方法,感覺像是let和apply的結合。

fun <T, R> with(receiver: T, f: T.() -> R): R = receiver.f()

代碼示例:

fun testWith() {
    // fun <T, R> with(receiver: T, f: T.() -> R): R = receiver.f()
    with(ArrayList<String>()) {
        add("testWith")
        add("testWith")
        add("testWith")
        println("this = " + this)
    }.let { println(it) }
}
// 運行結果
// this = [testWith, testWith, testWith]
// kotlin.Unit

class文件

 public static final void testWith()
  {
    Object localObject = new ArrayList();
    ArrayList localArrayList1 = (ArrayList)localObject;
    int $i$a$1$with;
    ArrayList $receiver;
    $receiver.add("testWith");
    $receiver.add("testWith");
    $receiver.add("testWith");
    String str = "this = " + $receiver;
    System.out.println(str);
    localObject = Unit.INSTANCE;
    Unit it = (Unit)localObject;
    int $i$a$2$let;
    System.out.println(it);
  }

run

run函數(shù)和apply函數(shù)很像伤溉,只不過run函數(shù)是使用最后一行的返回般码,apply返回當前自己的對象。

fun <T, R> T.run(f: T.() -> R): R = f()

代碼示例

fun testRun() {
    // fun <T, R> T.run(f: T.() -> R): R = f()
    "testRun".run {
        println("this = " + this)
    }.let { println(it) }
}
// 運行結果
// this = testRun
// kotlin.Unit

class文件

  public static final void testRun()
  {
    Object localObject = "testRun";
    String str1 = (String)localObject;
    int $i$a$1$run;
    String $receiver;
    String str2 = "this = " + $receiver;
    System.out.println(str2);
    localObject = Unit.INSTANCE;
    Unit it = (Unit)localObject;
    int $i$a$2$let;
    System.out.println(it);
  }

總結

怎么樣乱顾,是不是看暈了板祝,沒關系,我們來總結下走净。

函數(shù)名 定義 參數(shù) 返回值 extension 其他
let fun <T, R> T.let(f: (T) -> R): R = f(this) it 閉包返回
apply fun <T> T.apply(f: T.() -> Unit): T { f(); return this } 無券时,可以使用this this
with fun <T, R> with(receiver: T, f: T.() -> R): R = receiver.f() 無,可以使用this 閉包返回 調(diào)用方式與其他不同
run fun <T, R> T.run(f: T.() -> R): R = f() 無伏伯,可以使用this 閉包返回
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末橘洞,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子说搅,更是在濱河造成了極大的恐慌炸枣,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件弄唧,死亡現(xiàn)場離奇詭異抛虏,居然都是意外死亡,警方通過查閱死者的電腦和手機套才,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來慕淡,“玉大人背伴,你說我怎么就攤上這事》逅瑁” “怎么了傻寂?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長携兵。 經(jīng)常有香客問我疾掰,道長,這世上最難降的妖魔是什么徐紧? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任静檬,我火速辦了婚禮,結果婚禮上并级,老公的妹妹穿的比我還像新娘拂檩。我一直安慰自己,他們只是感情好嘲碧,可當我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布稻励。 她就那樣靜靜地躺著,像睡著了一般愈涩。 火紅的嫁衣襯著肌膚如雪望抽。 梳的紋絲不亂的頭發(fā)上加矛,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天,我揣著相機與錄音煤篙,去河邊找鬼斟览。 笑死,一個胖子當著我的面吹牛舰蟆,可吹牛的內(nèi)容都是我干的趣惠。 我是一名探鬼主播,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼身害,長吁一口氣:“原來是場噩夢啊……” “哼味悄!你這毒婦竟也來了?” 一聲冷哼從身側響起塌鸯,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤侍瑟,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后丙猬,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體涨颜,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年茧球,在試婚紗的時候發(fā)現(xiàn)自己被綠了庭瑰。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡抢埋,死狀恐怖弹灭,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情揪垄,我是刑警寧澤穷吮,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站饥努,受9級特大地震影響捡鱼,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜酷愧,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一驾诈、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧溶浴,春花似錦翘鸭、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春生蚁,著一層夾襖步出監(jiān)牢的瞬間噩翠,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工邦投, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留伤锚,地道東北人。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓志衣,卻偏偏與公主長得像屯援,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子念脯,可洞房花燭夜當晚...
    茶點故事閱讀 44,700評論 2 354

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