----《第一季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)