每天學一點 Kotlin -- 函數(shù):標準庫函數(shù)

----《第一季Kotlin崛起:次世代Android開發(fā) 》學習筆記

總目錄:每天學一點 Kotlin ---- 目錄
上一篇:每天學一點 Kotlin -- 函數(shù):尾遞歸函數(shù)
下一篇:每天學一點 Kotlin -- 函數(shù):泛型函數(shù)

1. 標準庫函數(shù)

1.1 Kotlin 提供了一個系統(tǒng)庫隅要,是 Java 庫的增強魁袜。其中有很多函數(shù)在適配了 Java 的類型和方法同時使用 Kotlin 的語法橡淑。其中一些 底層的函數(shù) 是使用比較廣泛的。

2. apply

2.1 apply 函數(shù)是對 Any 類型的一個擴展捞奕,所以任何類型的實例都可以調用。

2.2 apply 調用的時候接受一個 Lambda 表達式忘巧,可以任意調用該對象的任意方法玄捕,然后返回該對象。主要用于實例在返回自身之前满钟,初始化一些代碼之類的功能胜榔。

2.3 舉個栗子:

fun main() {
//    testNoApply()
    testWithApply()
}

fun testNoApply() {
    val task = Runnable { println("Runnable 在運行中...") }
    Thread(task).apply { isDaemon = true }.start()
}

fun testWithApply() {
    val task = Runnable { println("Runnable running...") }
    val thread = Thread(task)
    thread.isDaemon = true
    thread.start()
}

3. let

3.1 let 默認當前這個對象作為閉包的 it 參數(shù)胳喷,返回值是函數(shù)里面最后一行湃番,或者指定 return。

3.2 舉個栗子:

fun main() {
    println(myLet())
}

fun myLet(): Int {
    "myLet".let {
        println(it)
        return 100
    }
}

打印結果:

myLet
100

4. with

4.1 有時候一個要執(zhí)行一個對象的很多個方法勢必要寫很多次對象名吭露,顯得有點啰嗦吠撮,比如:

val student: Student = Student()
student.name = ""
student.age = 10
student.fun1()
student.fun2()
student.fun3()

使用了with后:

with(student){
name = ""
age = 10
fun1()
fun2()
fun3()
}

4.2 舉個栗子:

fun main() {
    testWith()
}

fun testWith() {
    with(ArrayList<String>()) {
        add("testWith aaaa")
        add("testWith bbbb")
        add("testWith 123")
        println("this = " + this)
    }.let { println(it) }
}

打印結果:

this = [testWith aaaa, testWith bbbb, testWith 123]
kotlin.Unit

5. run

5.1 run 函數(shù)和 apply 函數(shù)很像,只不過 run 函數(shù)是使用最后一行的返回讲竿,apply 返回當前自己的對象泥兰。run 就是 with 和 let 的組合式擴展。

5.2 舉個栗子:

fun main() {
    testRun()
}

fun testRun() {
    ArrayList<String>().run {
        add("testRun aaaa")
        add("testRun bbbb")
        add("testRun 123")
        println("this = " + this.joinToString())
    }
}

打印結果:

this = testRun aaaa, testRun bbbb, testRun 123

6. lazy

6.1 lazy 可以把非常耗費資源的操作延遲到第一次調用時再進行加載

6.2 舉個栗子:

fun readFile(): String{
  // 耗時操作...
}
val lazyRead = lazy { readFIle() }

val str = lazyRead.value

第一次請求結果的時候题禀,才能訪問到這個延遲加載的引用鞋诗。

6.3 延遲加載是很多編程語言和框架都具有的通用方法。使用內置函數(shù)的優(yōu)點是相關的同步問題系統(tǒng)會自動解決好迈嘹。也就是說如果值被請求了2次削彬,Kotlin 會安全處理任何訪問競爭,因為只執(zhí)行一次相關的函數(shù)秀仲。

7. use

7.1 use 和 try 語句有點相似融痛。use 被用于一個可 closeable 的實例且有一個可操作這個 closeable 的閉包。use 會安全地調用這個函數(shù)神僵,在函數(shù)調用完成后會關閉占用的資源雁刷,不管是否出現(xiàn)異常。比如:

fun testUse() {
    val input = Files.newInputStream(Paths.get("input.txt"))
    val byte = input.use { input.read() }
}

7.2 本質上保礼,use 在一些比較簡單的 case 上比使用 try/catch/finally 代碼塊處理資源更加直觀沛励。

8. repeat

8.1 repeat 按指定次數(shù)重復執(zhí)行一個閉包责语。repeat 的參數(shù)接受一個 Int 類型參數(shù)來指定次數(shù)。一個閉包用來包含要執(zhí)行的語句目派。一個簡單函數(shù)可以避免用 for 循環(huán)來重復執(zhí)行鹦筹。

8.2 舉個栗子:

fun main() {
    testRepeat()
}

fun testRepeat() {
    repeat(5, { println("測試 repeat 語句") })
}

打印結果:

測試 repeat 語句
測試 repeat 語句
測試 repeat 語句
測試 repeat 語句
測試 repeat 語句

9. require/assert/check

9.1 Kotlin 提供一個3件套函數(shù),能讓我們添加一系列正式說明到程序中址貌。一個正式說明是指一個斷言可以當執(zhí)行到斷言的位置時報錯結果 true 或 false铐拐。被稱為按“契約”設計:
(1) require 會拋出一個異常,用來確保參數(shù)符合輸入條件
(2) assert 會拋出一個 AssertionException练对,用來確保內部狀態(tài)整合
(3) check 會拋出一個 IllegalStateException遍蟋,用來確保內部狀態(tài)整合
這3件套函數(shù)還是非常相似的,區(qū)別在意拋出的異常類型不同螟凭。assert 可以在程序運行時禁用虚青,但 require 和 check 不能被禁用。

9.2 舉個栗子:

fun main() {
    testRequire(2)
    testRequire(0)
}

fun testRequire(x: Int) {
    require(x > 0, { "參數(shù)必須大于0" })
    println("testRequire -- x = " + x)
}

打印結果:

testRequire -- x = 2
Exception in thread "main" java.lang.IllegalArgumentException: 參數(shù)必須大于0
    at TestFun5Kt.testRequire(TestFun5.kt:70)
    at TestFun5Kt.main(TestFun5.kt:19)
    at TestFun5Kt.main(TestFun5.kt)
相關代碼:https://gitee.com/fzq.com/test-demo
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末螺男,一起剝皮案震驚了整個濱河市棒厘,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌下隧,老刑警劉巖奢人,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異淆院,居然都是意外死亡何乎,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進店門土辩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來支救,“玉大人,你說我怎么就攤上這事拷淘「髂” “怎么了?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵启涯,是天一觀的道長贬堵。 經(jīng)常有香客問我,道長逝嚎,這世上最難降的妖魔是什么扁瓢? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮补君,結果婚禮上引几,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好伟桅,可當我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布敞掘。 她就那樣靜靜地躺著,像睡著了一般楣铁。 火紅的嫁衣襯著肌膚如雪玖雁。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天盖腕,我揣著相機與錄音赫冬,去河邊找鬼。 笑死溃列,一個胖子當著我的面吹牛劲厌,可吹牛的內容都是我干的。 我是一名探鬼主播听隐,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼补鼻,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了雅任?” 一聲冷哼從身側響起风范,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎沪么,沒想到半個月后硼婿,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡成玫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年加酵,在試婚紗的時候發(fā)現(xiàn)自己被綠了拳喻。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片哭当。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖冗澈,靈堂內的尸體忽然破棺而出钦勘,到底是詐尸還是另有隱情,我是刑警寧澤亚亲,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布彻采,位于F島的核電站,受9級特大地震影響捌归,放射性物質發(fā)生泄漏肛响。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一惜索、第九天 我趴在偏房一處隱蔽的房頂上張望特笋。 院中可真熱鬧,春花似錦巾兆、人聲如沸猎物。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蔫磨。三九已至淘讥,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間堤如,已是汗流浹背蒲列。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留搀罢,地道東北人嫉嘀。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像魄揉,于是被迫代替她去往敵國和親剪侮。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,611評論 2 353

推薦閱讀更多精彩內容