Kotlin學習路(六):擴展函數

<本文學習郭神《第三行代碼》總結>

擴展函數:在不修改某個類源碼的情況下,仍然可以打開這個類,向這個類添加新的函數。

擴展函數可以讓API更簡潔,更加面向對象。

定義擴展函數的語法結構:

fun ClassName.methodName(param1:Int, param2:Int):Int {
//結構體
return 0
}

例如:一段字符串可能包含字母、數字、特殊字符等字符,現在需要統計字符串中字母的數量,如果按照一般寫法:

object StringUtil {
    fun letters(str: String): Int {
        var count = 0
        for (char in str){
            if (char.isLetter()){
                count ++
            }
        }
        return count
    }
}

這裏定義一個StringUtil的單例類,然後定義一個方法letters,接收一個字符串參數,返回一個整型,使用for循環遍歷,每查出一個字母,count計數加1。

工具類寫好了,那麼現在調用該方法:

val str = "ahufh18294#$$%"
val count = StringUtil.letters(str)

這種是常規寫法,也是最標準的實現思維。

但是使用擴展函數,就會不一樣了,一種更加面向對象的思維方式實現該功能,比如將上述的letters方法添加到String類中。

因爲向String類中添加一個擴展函數,首先要新建一個String.kt 文件。

注意:(1)這裏文件名沒有固定要求,只是爲了方便知道向哪一個類中添加擴展函數,所以建議使用相同的類名。
(2)擴展函數也可以定義在任何一個現有類中。
(3)最好定義成頂層方法,這樣可以進行全局訪問域。

上述代碼就可以修改爲:

fun **String**.letters() : Int{
    var count = 0
    for (char in this){
        if (char.isLetter()){
            count ++
        }
    }
    return count
}

這裏是頂層方法。

現在將letters()方法定義爲了String類的擴展函數,那麼函數中就自動擁有了String實例的上下文,因此letters函數就不需要接收一個字符串參數了,而是直接遍歷this即可。
接下來調用該方法就可以直接寫成:

val str = "ahufh18294#$$%".letters()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章