Kotlin 標(biāo)準(zhǔn)庫提供了一些擴(kuò)展 Java 庫的函數(shù)越平。
- apply
apply 是 Any 的擴(kuò)展函數(shù), 因而所有類型都能調(diào)用频蛔。
apply 接受一個lambda表達(dá)式作為參數(shù),并在apply調(diào)用時立即執(zhí)行秦叛,apply返回原來的對象晦溪。
apply 主要作用是將多個初始化代碼鏈?zhǔn)讲僮鳎岣叽a可讀性挣跋。
如:
val task = Runnable { println("Running") }
Thread(task).apply { setDaemon(true) }.start()
上面代碼相對于
val task = Runnable { println("Running") }
val thread = Thread(task)
thread.setDaemon(true)
thread.start()
- let
let 和 apply 類似三圆, 唯一的不同是返回值,let返回的不是原來的對象,而是閉包里面的值舟肉。
val outputPath = Paths.get("/user/home").let {
val path = it.resolve("output")
path.toFile().createNewFile()
path
}
outputPath 結(jié)果是閉包里面的 path修噪。
- with
with 是一個頂級函數(shù), 當(dāng)你想調(diào)用對象的多個方法但是不想重復(fù)對象引用路媚,比如代碼:
val g2: Graphics2D = ...
g2.stroke = BasicStroke(10F)
g2.setRenderingHint(...)
g2.background = Color.BLACK
可以用 with 這樣寫:
with(g2) {
stroke = BasicStroke(10F)
setRenderingHint(...)
background = Color.BLACK
}
- run
run 是 with和let 的組合黄琼,例如
val outputPath = Paths.get("/user/home").run {
val path = resolve("output")
path.toFile().createNewFile()
path
}
- lazy
lazy延遲運(yùn)算,當(dāng)?shù)谝淮卧L問時整慎,調(diào)用相應(yīng)的初始化函數(shù)脏款,例如:
fun readFromDb(): String = ...
val lazyString = lazy { readFromDb() }
val string = lazyString.value
當(dāng)?shù)谝淮问褂?lazyString時, lazy 閉包會調(diào)用裤园。一般用在單例模式弛矛。
- use
use 用在 Java 上的 try-with-resources 表達(dá)式上, 例如:
val input = Files.newInputStream(Paths.get("input.txt"))
val byte = input.use({ input.read() })
use 無論如何都會將 input close, 避免了寫復(fù)雜的 try-catch-finally 代碼比然。
- repeat
顧名思義丈氓,repeat 接受函數(shù)和整數(shù)作為參數(shù),函數(shù)會被調(diào)用 k 次强法,這個函數(shù)避免寫循環(huán)万俗。
repeat(10, { println("Hello") })
- require/assert/check
require/assert/check 用來檢測條件是否為true, 否則拋出異常。
require 用在參數(shù)檢查饮怯;
assert/check 用在內(nèi)部狀態(tài)檢查闰歪, assert 拋出 AssertionException, check 拋出 IllegalStateException蓖墅。
示例
fun neverEmpty(str: String) {
require(str.length > 0, { "String should not be empty" })
println(str)
}
參考
《Programming Kotlin》Stephen Samuel 库倘,Stefan Bocutiu
《Kotlin in Action》Dmitry Jemerov,Svetlana Isakova