《在飞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语言,希望我的博客对你有帮助!

相关源码  

      

猜你喜欢

转载自blog.csdn.net/pangzaifei/article/details/85076557