對於Kotlin
中的函數來講,和JavaScript
或者Lua
這些語言很像,它有着這些語言的特性。可是也與這些語言就着許多不一樣之處。或許你更瞭解Java
語言,然而對於Java
語言來講,它不是否是閉包
這個特性的。因爲在這篇文章主要是講解函數的基本使用,故而只會講解到函數的定義
、函數的返回值
、函數的參數
等。剩下的部分我會在這個系列的高級篇會給你們奉上。git
在
Kotlin
中函數的聲明,同JavaScript
類似。github
Kotlin
中的函數聲明關鍵字爲:fun
- 定義格式爲:
可見性修飾符 fun 函數名(參數名 :類型,...) : 返回值{}
這裏的可見性修飾符
請參見個人另外一篇文章Kotlin——中級篇(三):可見性修飾符詳解,至於返回值
以及參數
請繼續往下面看編程
例:定義一個最基本的函數數組
fun basis(){
...
}
複製代碼
注意:閉包
- 上面的例子中沒有
可見性修飾符
,那是由於Kotlin
中默認爲public
可見性修飾符()
圓括號必須存在,即便是沒有參數的狀況下{}
大括號必須存在,即便是沒有函數體的時候,不過在Kotlin
中有一個特例就是,函數具有返回值的時候,若是隻用一個表達式就能夠完成這個函數,則可使用單表達式函數。在下面會詳細的給你們講解- 在函數沒有
返回值
時能夠省略其返回值
成員函數是指在
類
或對象
中的內部函數。你能夠參見個人另外一篇文章Kotlin——中級篇(一):類(class)詳解編輯器
例:聲明一個類,在類中在定義一個方法,這個方法就是這個類的成員函數ide
class Test{
fun foo(){}
}
複製代碼
函數的使用分爲兩種:函數
- 普通的使用
- 成員函數的使用
例:post
// 普通的使用
basis()
// 若是函數有返回值
val x = basis()
// 成員函數的使用:先初始化對象,在根據對象使用`中綴符號(.)`調用其成員函數
Test().foo()
// 若是函數有返回值
val x = Test().foo()
複製代碼
在
Kotlin
中,函數的返回值類型能夠分爲:spa
Unit
類型:該類型即無返回值的狀況,能夠省略。- 其餘類型: 顯示返回類型的狀況
- 這個類型能夠理解爲函數無返回值。
例:
fun unitFun() : Unit{
println("我是返回值爲Unit的函數,Unit可省略")
return
// return Unit 可省略
// 或者 return 可省略
}
等價於
fun unitFun(){
println("我是返回值爲Unit的函數,Unit可省略")
}
複製代碼
當無返回值時,使用平時Java
語法寫普通函數同樣便可。不需顯示寫成Unit
。這裏只是作一個介紹而已
這個類型能夠理解爲,該函數具備返回值,而且返回值類型不能省略,而且
return
也不能省略
例: 定義一個返回類型爲Int
的函數
fun returnFun() : Int{
return 2
}
複製代碼
對於函數中的參數來講,這裏主要分爲幾個模塊來說解:
- 具備參數的基本函數聲明
- 默認參數,即參數具備默認值
- 命名參數,當傳遞參數的時候顯示使用
參數名
=參數值
- 可變數量的參數:即參數的個數不定。
定義一個具備參數的函數,使用
Pascal
表示法定義,即爲:name : type
。其中的參數必須具備顯示的參數類型,而且參數與參數之間用逗號(,
)隔開。
例:
fun funArgs(numA : Int, numB : Float){
println("numA = $numA \t numB = $numB")
}
fun main(args: Array<String>) {
funArgs(1,10f)
}
複製代碼
對於默認參數,即便指一個函數中的參數具備默認值,這樣在使用該函數的時候,能夠省略一部分參數,能夠減小函數的重載
例:定義個具備默認參數的函數
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——中級篇(四):繼承類詳解
即在使用函數時顯示使用
參數名
=參數值
這種方式傳遞參數
例:這裏舉例一個普通的具備參數函數與具備默認參數函數的結合使用
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
的這種便利性而已。
- 當一個函數中的參數是不定數量的個數而且是同一個類型,則但是使用
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
Github:Jteictors