kotlin-第二章 05:函數與Lambda閉包 06:擴展函數 07:Lambda閉包 08:高階函數

05:函數與Lambda閉包

1. 有默認參數的函數

通常用於函數重載特別多的時候
有默認值的函數可以大大減少函數的重載數量

fun print(name:String = "zhang tao"){
    println(name)
}
fun main() {
    print()

2. 如果函數中只有一條語句

可以直接賦值該語句給函數

fun print(name:String = "zhang tao") = println(name)
3. 函數嵌套

一般用於在某些條件下出發遞歸的函數
或不希望被外部訪問到的函數

fun function() {
    var str = "hello"
    fun say(count: Int = 10) {
        println(str)
        if(count>0){
            say(count-1)
        }
    }
    say()
}
fun main() {
    function()
}

06:擴展函數

kotlin可以靜態給一個類擴展它的成員變量和成員方法
對第三方SDK或那個類是你不能控制的類,你想給他新增一些你需要用到一些方法的時候
java中調用kotlin的擴展函數,第一個參數一定是擴展的那個對象。

fun File.readText(charset: Charset = Charsets.UTF_8): String = readBytes().toString(charset)

var file = File("")
val content = file.readText()

String content = FileKt.readText(file,Charsets.UTF_8)
擴展函數的靜態解析

open關鍵字表示不final,與java的final關鍵字正好相反,因爲kotlin聲明一個類的時候會默認添加final修飾符。
kotlin擴展函數是靜態給一個類添加的,不具備運行時的一個多態效用的。

open class Animal
class Dog : Animal()

fun Animal.name() = "animal"

fun Dog.name() = "dog"

fun Animal.println(a:Animal){
    println(a.name())
}

fun main() {
    //輸出animal
    Dog().println(Dog())
}

07:Lambda閉包

java最初

Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
            }
        });

java8的Lambda

Thread thread = new Thread(()->{
});

kotlin的Lambda

val thread = Thread({ -> Unit })

如果Lambda沒有參數,可以省略箭頭符號->

val thread = Thread({ Unit })

如果Lambda是函數的最後一個參數,可將大括號放在小括號外面

val thread = Thread(){ }

如果函數只有一個參數,且這個參數是Lambda,則可省略小括號

val thread = Thread{ }
Lambda閉包聲明

kotlin中lambda閉包參數是有上限的,最多22個

val echo ={name:String->
  println(name)
}

08:高階函數

高階函數:函數的參數是函數

當Lambda作爲函數的最後一個參數時,可以寫在函數的小括號之外

fun onlyIf(isDebug: Boolean, block: () -> Unit) {
    if(isDebug){
        block()
    }
}

fun main() {
    onlyIf(true){
        println("haha")
    }
}
函數是”一等公民”
用內聯優化代碼

kotlin的Lambda是一個匿名對象
可以使用inline修飾方法,這樣當方法在編譯時就會拆解方法的調用爲語句調用,進而減少創建不必要的對象。
inline一般只用於修飾高階函數,而不會亂用它。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章