標準函數
首先我們介紹標準函數 with、run、apply,如果你瞭解javascript,那理解kotlin的標準函數width、run、apply那簡直不要太輕鬆。with、run、apply與javascript中的with的意義基本一模一樣,只是含有一些細微差別。
with
with它接收兩個參數,第一個參數可以是任意類型的對象,第二個參數是一個Lambda表達式。with函數會在Lambda表達式中提供第一個對象的上下文,可以直接使用對象的屬性或方法,而不需要帶上對象前綴。with函數會使用Lambda表達式中的最後一行代碼作爲返回值返回。
val result = with(obj) {
// 這裏是obj的上下文環境
doSomething() // 調用obj的doSomething方法,無需 obj.doSomething() 這種形式調用
}
run
run函數的用法與使用場景和with函數非常類似,只是做了些許改動。run函數無法直接調用,他需要在某個對象的基礎上去調用它;其次run函數值接收一個Lambda表達式作爲參數,並且會在Lambda表達中提供調用對象的上下文,同樣將Lambda表達式中的最後一行代碼作爲返回值。
val result = obj.run { // 這裏是obj的上下文環境 doSomething() // 調用obj的doSomething方法,無需 obj.doSomething() 這種形式調用 }
apply
apply函數和run函數在用法上基本一模一樣,唯一區別是apply函數不會將Lambda表達式中的最後一行作爲參數返回,而是會返回對象本身.
val result = obj.apply {
// 這裏是obj的上下文環境
doSomething() // 調用obj的doSomething方法,無需 obj.doSomething() 這種形式調用
}
// result == obj
靜態方法
在java中定義一個靜態方法如下:
public class Util {
public static void doSome() {
// todo
}
}
// 使用靜態方法
Util.doSome()
而Kotlin提供了幾種方式去實現類似java中的靜態方法
- 單例類實現靜態方法
// 聲明一個單例類
object Util {
fun doSome() {
// todo
}
}
// 使用
Util.doSome()
- 伴生類實現靜態方法
單例類的寫法會讓類中的所有方法全部變成了類似靜態方法的調用形式,如果我們只是希望類中的某些方法變成靜態方法的調用形式怎麼辦呢?kotlin給我們提供了伴生類 companion object。
class Utl {
companion obj {
fun doSome() {
// todo
}
}
}
// 使用
Util.doSome()
這個關鍵字實際會在Util類的內部創建一個伴生類,Kotlin會保證一個類中只會存在一個伴生類對象,調用Util.doSome()實際上是調用Util類中的伴生類對象的doSome方法。
- 註解實現靜態方法
如果我們確確實實需要定義真正的靜態方法,我們可以給單例類或companion object伴生類中的方法加上 @JvmStatic註解,那麼kotlin編譯器就會將這些方法編譯成真正的靜態方法。注意這個註釋一般加在單例類或伴生類的方法上,如果加在普通方法上,會直接提示語法錯誤。
class Utl {
companion obj {
@JvmStatic
fun doSome() {
// todo
}
}
}
// 使用
Util.doSome()
- 頂層方法實現靜態方法
頂層方法指的是哪些沒有定義在任何類中的方法,比如我們編寫的main()方法。kotlin編譯器會將所有的頂層方法全部編譯成靜態方法。所有的頂層方法在任何位置可以直接被調用,不用管包名路徑,也不用創建實例。但如果這個方法在Java代碼中調用,需要加上該方法所在的文件名。
// 如我們在Tool.kt 文件中創建了一個頂層方法
// Tool.kt
fun doSome() {
// todo
}
// 在java代碼中使用
public class JavaTest {
public void invokeStaticFunc() {
// 文件名+方法形式調用頂層方法
Tool.doSome()
}
}