Kotlin——初級篇(七):函數(方法)基礎總結


對於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參數是不具備默認值的。

  1. 我們可以這樣使用它:

    callFun("str")  // 這樣是可以的,因為后面的參數都具有默認值
    
  2. 當使用非默認參數調用它時,使用起來就和Java函數一樣:

    callFun("str",true,2,2.0,2)   // 這樣閱讀性很差,因為你除了看函數的定義外,你不知道這些參數的含義
    
  3. 使用命名參數我們可以使代碼更具有可讀性:

     callFun("str",isTrue = true,numA = 3, numB = 3.0f, numC = 3)
    
  4. 當我們不需要所有的參數時:

     callFun("str",isTrue = true)
    

不過當我們使用命名參數時,雖然可以提高代碼的閱讀性,及在我們使用第34時有一個坑,就是Java中不支持這種寫法的。而在實際的項目開發中,幾乎上都是和Java語言混用的。那么這種用法就不適合了。所有這里還是推薦使用12兩點的用法。這是只是介紹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
GithubJteictors

歡迎各位大佬進群共同研究、探索

QQ群號:497071402


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM