
對於Kotlin中的函數來說,和JavaScript或者Lua這些語言很像,它有着這些語言的特性。但是也與這些語言就着許多不同之處。或許你更了解Java語言,然而對於Java語言來說,它不是不是閉包這個特性的。由於在這篇文章主要是講解函數的基本使用,故而只會講解到函數的定義、函數的返回值、函數的參數等。剩下的部分我會在這個系列的高級篇會給大家奉上。
目錄

一、函數的聲明及基本使用
在
Kotlin中函數的聲明,同JavaScript相似。
1.1、函數的聲明
Kotlin中的函數聲明關鍵字為:fun- 定義格式為:
可見性修飾符 fun 函數名(參數名 :類型,...) : 返回值{}
這里的可見性修飾符請參見我的另一篇文章Kotlin——中級篇(三):可見性修飾符詳解,至於返回值以及參數請繼續往下面看
例:定義一個最基本的函數
fun basis(){
...
}
注意:
- 上面的例子中沒有
可見性修飾符,那是因為Kotlin中默認為public可見性修飾符()圓括號必須存在,即使是沒有參數的情況下{}大括號必須存在,即使是沒有函數體的時候,不過在Kotlin中有一個特例就是,函數具備返回值的時候,如果只用一個表達式就可以完成這個函數,則可以使用單表達式函數。在下面會詳細的給大家講解- 在函數沒有
返回值時可以省略其返回值
1.2、成員函數
成員函數是指在
類或對象中的內部函數。你可以參見我的另一篇文章Kotlin——中級篇(一):類(class)詳解
例:聲明一個類,在類中在定義一個方法,這個方法就是這個類的成員函數
class Test{
fun foo(){}
}
1.3、函數的使用
函數的使用分為兩種:
- 普通的使用
- 成員函數的使用
例:
// 普通的使用
basis()
// 如果函數有返回值
val x = basis()
// 成員函數的使用:先初始化對象,在根據對象使用`中綴符號(.)`調用其成員函數
Test().foo()
// 如果函數有返回值
val x = Test().foo()
二、函數的返回值
在
Kotlin中,函數的返回值類型可以分為:
Unit類型:該類型即無返回值的情況,可以省略。- 其他類型: 顯示返回類型的情況
2.1、Unit類型
- 這個類型可以理解為函數無返回值。
例:
fun unitFun() : Unit{
println("我是返回值為Unit的函數,Unit可省略")
return
// return Unit 可省略
// 或者 return 可省略
}
等價於
fun unitFun(){
println("我是返回值為Unit的函數,Unit可省略")
}
當無返回值時,使用平時Java語法寫普通函數一樣即可。不需顯示寫成Unit。這里只是做一個介紹而已
2.2 、其他顯示返回類型的返回值
這個類型可以理解為,該函數具有返回值,並且返回值類型不能省略,並且
return也不能省略
例: 定義一個返回類型為Int的函數
fun returnFun() : Int{
return 2
}
三、函數的參數
對於函數中的參數來說,這里主要分為幾個模塊來講解:
- 具有參數的基本函數聲明
- 默認參數,即參數具有默認值
- 命名參數,當傳遞參數的時候顯示使用
參數名=參數值- 可變數量的參數:即參數的個數不定。
3.1、具有參數的函數定義
定義一個具有參數的函數,使用
Pascal表示法定義,即為:name : type。其中的參數必須具有顯示的參數類型,並且參數與參數之間用逗號(,)隔開。
例:
fun funArgs(numA : Int, numB : Float){
println("numA = $numA \t numB = $numB")
}
fun main(args: Array<String>) {
funArgs(1,10f)
}
3.2、默認參數
對於默認參數,即使指一個函數中的參數具有默認值,這樣在使用該函數的時候,可以省略一部分參數,可以減少函數的重載
例:定義個具有默認參數的函數
fun defArgs(numA : Int = 1, numB : Float = 2f, numC : Boolean = false){
println("numA = $numA \t numB = $numB \t numC = $numC")
}
fun main(args: Array<String>) {
// 默認參數的函數使用
defArgs()
defArgs(1,10f,true)
}
輸出結果為:
numA = 1 numB = 2.0 numC = false
numA = 1 numB = 10.0 numC = true
可以看出:當具有默認參數時,可以對是參數有默認值的參數不傳遞參數值。
不過這里有一點值得注意的是: 當該函數是一個成員函數時,並且該函數時覆寫繼承類中的方法時,則該成員函數必須從簽名中省略該函數的默認值。其實這一點不必過於看重,因為在你覆寫方法時,編輯器都默認會幫你實現的..
舉例說明:
open class A{
open fun foo(i : Int = 10){}
}
class B : A(){
override fun foo(i: Int) {
super.foo(i)
println(i)
}
}
fun main(args: Array<String>) {
B().foo()
}
輸出結果為:10
如果你對類繼承不了解,可以參見我的另一篇文章Kotlin——中級篇(四):繼承類詳解
3.3、命名參數
即在使用函數時顯示使用
參數名=參數值這種方式傳遞參數
例:這里舉例一個普通的具有參數函數與具有默認參數函數的結合使用
fun callFun(str : String,
isTrue : Boolean = false,
numA : Int = 2,
numB: Float = 2.0f,
numC : Int = 2){}
可以看出,上面實例中的str參數是不具備默認值的。
-
我們可以這樣使用它:
callFun("str") // 這樣是可以的,因為后面的參數都具有默認值 -
當使用非默認參數調用它時,使用起來就和
Java函數一樣:callFun("str",true,2,2.0,2) // 這樣閱讀性很差,因為你除了看函數的定義外,你不知道這些參數的含義 -
使用命名參數我們可以使代碼更具有可讀性:
callFun("str",isTrue = true,numA = 3, numB = 3.0f, numC = 3) -
當我們不需要所有的參數時:
callFun("str",isTrue = true)
不過當我們使用命名參數時,雖然可以提高代碼的閱讀性,及在我們使用第3、4時有一個坑,就是Java中不支持這種寫法的。而在實際的項目開發中,幾乎上都是和Java語言混用的。那么這種用法就不適合了。所有這里還是推薦使用1、2兩點的用法。這是只是介紹Kotlin的這種便利性而已。
3.4、可變數量參數
- 當一個函數中的參數是不定數量的個數並且是同一個類型,則可是使用
vararg修飾符去修飾這個變量,則被vararg修飾的參數相當於一個固定類型的數組。- 聲明格式:
fun 函數名(vararg 參數名 : 類型,...) :返回值{}
例:
fun varargFun(numA: Int, vararg str : String){
// ...
}
其中,既然vararg修飾的變量相當於一個固定類型的數組,則我們可以對它進行一些高級的操作。這里只舉例一些簡單的用法,如果你有興趣,可以參見我的另一篇文章Kotlin——高級篇(五):集合之常用操作符匯總
例:
fun varargFun(numA: Int, vararg str : String){
// 遍歷
for (s in str) {
}
// 獲取元素
// str[index]
// str.component1() ... str.component5()
// 或者其高階函數用法
// str.map { }
// str.filter { }
// str.sortBy { }
}
在傳遞參數值時,我們可以一個一個參數的傳遞,或者可以直接傳遞一個當前定義類型的數組。不過在傳遞數組時,請使用伸展操作符( * )。
例:
普通傳遞 : varargFun(1,"aaa","bbb","ccc","ddd","fff")
數組傳遞:
val strArray = arrayOf("aaa","bbb","ccc","ddd","fff")
varargFun(1,*strArray)
四、單表達式函數
- 上面提到了
單表達式函數。這里詳細的講解一下。因為在結構體非常簡單的情況下,使用單表達式函數還是能提高代碼的閱讀性的,並且可以少些兩行代碼。- 單表達式函數:即函數具備返回值的時候,可以省略花括號並且在
=賦值符號之后指定代碼體,而函數的返回值是有編輯器自動推斷的。
例:
// 無參數的情況
fun test1() = 2 // 自動推斷為:返回類型為Int
// 有參數的情況
fun test2(num : Int) = num * 2 // 自動推斷為:返回類型為Int
// 或者
fun test3(x : Float, y : Int = 2) = x * y // 和默認參數一起使用,返回值為Float型
fun main(args: Array<String>) {
println(test1())
println(test2(2))
println(test3(2f))
}
輸出結果為:
2
4
4.0
總結
對於Kotlin中函數/方法的基本用法就講解到這里,在后續的章節中,會為大家奉上函數的高級用法以及高階函數的使用,並且會講到其和lambda表達式的連用。
這一篇講解的內容及其簡單,如果您有編程經驗您只要主要關注可變個數參數的函數,以及單表達式函數就可以額。
如果各位大佬看了之后感覺還闊以,就請各位大佬隨便star一下,您的關注是我最大的動力。
我的個人博客:Jetictors
我的掘金:Jteictors
Github:Jteictors
