1. 程式人生 > >《在飛Android Kotlin快速入門-lambda表示式篇2》

《在飛Android Kotlin快速入門-lambda表示式篇2》

hi各位,這章主要是lambda表示式的快速入門。

    大家都知道程式設計有OOP與FP(函數語言程式設計),Kotlin支援將函式,像java中的物件那樣來使用的,所以就有了lambda表示式。

一:閉包:   "()->Int    return{}"

     一個函式返回了一個內部函式,該內部函式引用了外部函式的相關引數和變數,我們把該返回的內部函式稱為閉包。

  // 一個函式返回了一個內部函式,該內部函式引用了外部函式的相關引數和變數,我們把該返回的內部函式稱為閉包。
    fun fun1(): () -> Int {
        var out = 1
        return {
            out + 5//引用外了外部函式中的out引數變數。把這個叫為閉包
        }
    }

二:函式引用:    "::"

      是在高階函式中使用,高階函式是說在你的fun()的引數中有()->Int這種的函式引用,有這種引數的函式就叫做高階函式。https://blog.csdn.net/pangzaifei/article/details/85076557

//testFun: (Int, Int) -> Int就是函式型別,所以test2就是高階函式
    fun test2(n1: Int, n2: Int, testFun: (Int, Int) -> Int): Int {
        return testFun(n1, n2)
    }
    fun test3Add(num1: Int, num2: Int): Int {
        return num1 + num2
    }
    fun test3Multiply(num1: Int, num2: Int): Int {
        return num1 * num2
    }
    //test2()第三個引數是函式型別,所以test2就是高階函式。第三個引數可以接受函式型別的範圍是(Int,Int)->Int的,也就是test3Add()和test3Multiply()這兩個函式
    //下面fun2()是呼叫test2()方法,第三個引數選擇傳入test3Add()或者test3Multiply()這兩個函式來相加或者相乘的操作,使用::來獲取函式引用
    fun fun2() {
        //獲取相加結果
        val addResult = test2(10, 5, this::test3Add)
        Log.e("fffpzf", "函式引用(::)獲取到相加結果:$addResult")
        //獲取相城結果
        val multiplayResult = test2(10, 5, this::test3Multiply)
        Log.e("fffpzf", "函式引用(::)獲取到相乘結果:$multiplayResult")
    }
===
E/fffpzf: 函式引用(::)獲取到相加結果:15
E/fffpzf: 函式引用(::)獲取到相乘結果:50
===

函式引用補充:

   在Android開發中經常使用到startActivity(inetn())啟動一個頁面,那麼調轉的Activity就需要用::引用來實現。如下

//MainActivity::class.java當前頁面跳轉到MainActivity頁面
startActivity(Intent(this, MainActivity::class.java))

 

三:lambda表示式   "{}"

        在高階函式的基礎上,Kotlin可以自動推斷出引數型別,返回值不需要寫,自動判斷出返回型別,所以就有了{},下面是變形步驟。轉載請註明出處:

https://blog.csdn.net/pangzaifei/article/details/85076557

 fun fun3() {
        //看test2的第三個引數
        val test2 = test2(10, 5, { m, n -> m + n })
        Log.e("fffpzf", "lambda表示式初步變形1結果:$test2")
    }

    fun fun4() {
        //看test2的第三個引數
        //如果最後一個引數是lambda表示式,那麼()可以前提,類似下面這種
        val test2 = test2(10, 5) { m, n -> m + n }
        Log.e("fffpzf", "lambda表示式有參變形2結果:$test2")
    }

===
E/fffpzf: lambda表示式初步變形1結果:15
    lambda表示式有參變形2結果:15
===
    fun fun5() {
        val setOf = mutableSetOf<String>()
        setOf.add("set_a")
        setOf.add("set_b")
        setOf.add("set_c")
    //如果lamdba是無引數的,就可以刪除(),那麼就變成forEach{}這樣的了
        setOf.forEach {
            if (it == "set_a") Log.e("fffpzf", "獲取到:set_a") else Log.e("fffpzf", "我是:$it")
        }
           //下面這是forEach的原始碼,我們發現裡面只有一個action: (T) -> Unit函式引數,所以這就是我們為什麼在用forEach{}遍歷的時候可以直接用{}
           //同時,如果只有一個引數,那麼可以省略引數名,然後用it來替代它。這也就是為什麼forEach{}中可以用it
        @kotlin.internal.HidesMembers
        public inline fun <T> Iterable<T>.forEach(action: (T) -> Unit): Unit {
            for (element in this) action(element)
        }
    }

四:lambda表示式的返回值:{這裡面的最後一行就是返回值}

五:一些lambda表示式例子

 fun fun6() {
        val setOf = mutableSetOf<String>()
        setOf.add("set_a")
        setOf.add("set_b")
        setOf.add("set_c")
        setOf.add("set_b")
        setOf.forEach {
            if (it == "set_a") Log.e("fffpzf", "獲取到:set_a") else Log.e("fffpzf", "我是:$it")
        }
        var index = setOf.indexOfFirst {
            //找到第一個叫set_b的下表
            it.startsWith("set_b")
        }
        Log.e("fffpzf","第一個set_b下表:$index")
        val str=setOf.find {
            it.startsWith("set")
        }
        Log.e("fffpzf","找到第一個set開頭的全名:$str")
        setOf.filter {
            //過濾
        }
        setOf.sortedBy {
            //排序
        }
        setOf.groupBy {
            //分組
        }

    }

Ps:我是在飛,只有空閒時間才能更新部落格,所以本系列偏快速入門,主要講實戰中經常用到內容,讓你快速上手。所以文章儘量簡短,敬請諒解,本系列文章預設閱讀者已經熟悉java語言,希望我的部落格對你有幫助!

相關原始碼