Kotlin從入門到放棄(四) 函數(shù)運用
本篇主要總結(jié)和分析Kotlin對函數(shù)提供的新功能怠褐,包括函數(shù)的基本定義昌腰、輸入?yún)?shù)褂删、輸出參數(shù)的類型定義來歸納整理飞醉。
1.函數(shù)的基本用法
1.1與Java聲明方式的區(qū)別
Java編寫的onCreate函數(shù)如下:
@Override
public void onCreate(Bundle savedInstanceState){
...
}
Kotlin編寫的onCreate函數(shù)如下:
override fun onCreate(savedInstanceState: Bundle?) {
...
}
- Java使用“@Override”來表示父類的方法,Kotlin使用小寫的“override”在同一行表示進行重載操作屯阀。
- Java使用“public”表示公共方法缅帘,Kotlin默認函數(shù)就是公開的,所以省略關(guān)鍵字难衰。
- Java使用“void”表示函數(shù)無返回值钦无,Kotlin無返回參數(shù),不用特別說明召衔。
- Kotlin新增了關(guān)鍵字“fun”铃诬,來表達這是函數(shù)定義
- Java 聲明參數(shù)的格式為“變量類型 變量名稱”,而Kotlin為“變量名稱:變量類型”
- Kotlin引入了空安全機制,如果某個變量允許為空趣席,則在變量類型后面加兵志?
1.2輸入?yún)?shù)的格式
無參函數(shù)寫法如下:
fun setText(){
tx.setText("Java")
}
有參函數(shù)的寫法如下:
fun setText(str:String){
tx.setText(str)
}
在Kotlin中調(diào)用函數(shù)方法和Java中一樣,直接采取“函數(shù)名稱(參數(shù)列表)”
setText(str)
1.3輸出參數(shù)的格式
fun main():Int
當開發(fā)者不聲明任何返回參數(shù)宣肚,Kotlin函數(shù)也會默認返回一個Unit類型的對象想罕。
因為Unit類型的參數(shù)無須開發(fā)者返回具體的值,所以Kotlin代碼往往把函數(shù)名稱后面的“:Unit”直接省略掉了霉涨。增加Unit類型的目的是為了讓函數(shù)定義完全符合變量定義的形式按价,函數(shù)需要具體的輸出函數(shù),加關(guān)鍵字return 返回參數(shù)值笙瑟。
fun setText(str:String):String{
tx.setText(str)
return str
}
2.輸入?yún)?shù)的變化
2.1默認參數(shù)
Java的默認參數(shù)允許在定義函數(shù)時直接輸入?yún)?shù)的默認值楼镐,如果調(diào)用函數(shù)時沒有給出某參數(shù)的具體值,系統(tǒng)就自動對該參數(shù)賦予默認值往枷。寫法如下
fun setText(str:String = "Kotlin"):String{
tx.setText(str)
return str
}
2.2命名參數(shù)
如果不滿意默認值框产,我們可以在調(diào)用函數(shù)時輸入新的值。具體格式“參數(shù)名= 參數(shù)值”
setText(str = "Java")
2.3可變參數(shù)
Kotlin新增了關(guān)鍵字vararg错洁,表示后面的參數(shù)格式是不確定的秉宿。寫法如“vararg arg:String?”屯碴。
Kotlin同時也支持可變的數(shù)組參數(shù)描睦,寫法如下
vararg nameArray: Array<String>
3.幾種特殊的函數(shù)
3.1泛型函數(shù)
定義泛型函數(shù)時,得在函數(shù)名稱前面加“<T>",表示以T聲明的參數(shù)导而,其參數(shù)類型在函數(shù)調(diào)用時指定忱叭。
fun <T> setText(str:T):T{
return str
}
3.2內(nèi)聯(lián)函數(shù)
舉個例子,Int嗡载、Float窑多、Double都繼承自Number類仍稀,但是定義一個輸入?yún)?shù)為setArray(array:Array<Number>)的函數(shù)洼滚,他并不接受值為Int的參數(shù)。這是我們需要指定T繼承自基類Nuember技潘,同時在fun 前面添加inline遥巴,表示此函數(shù)屬于內(nèi)聯(lián)函數(shù)。用法如下
inline fun <reified T:Number> setText(str:T):T {
return str
}