Lambda

作者: 码农修行之路 | 来源:发表于2020-11-25 23:52 被阅读0次

    Lambda表达式

    • Lambda表达式其实是一个匿名函数,是对匿名内部类的一种简化
    • Lambda表达式是函数式编程的基础
    • 所谓的函数式编程实际上就是一种编程规范,即如何编写程序的方法论
    • 函数式编程的思想是将电脑运算视为函数的计算,并且计算的函数可以接收函数作为输入参数或当作返回值来使用,使用函数式编程可以减少代码的重复,提高程序的开发效率

    Lambda表达式相对于普通函数的区别:

    1. 普通函数有四种返回值类型:无参无返回值、无参有返回值、有参有返回值、有参无返回值
    2. Lambda表达式有两种返回值类型:无参有返回值、有参有返回值
    fun main() {
        // 无参有返回值
        val result1 = {
            "无参有返回值"// 函数体
        }() // "()"代表执行调用表达式
        println(result1)
        // 有参有返回值
        val result2 = { a: Int, b: Int -> // 参数需要在大括号后面定义 返回值用箭头指引返回
            a + b // 函数体
        }(22, 33) // "()"代表执行调用表达式
        println("两值相加: $result2")
    }
    
    Lambda表达式返回值

    上述实例中 我,嗯可以看到Lambda表达式中 已经省略了返回值和返回值类型,那么我们应该如何来声明返回值的类型和返回值呢?看下面实例:

    fun main() {
        val result = {
            "字符串"
            22
            //22.3f
        }()
        
        //println(result is String)
        //println(result is Float)
        println(result is Int)
    }
    
    • Lambda表达式中 返回值是函数体最后一行的值 返回值类型也是最后一行值的类型
    • Lambda表达式可以定义在方法内部 也可以作为函数的实际的参数或返回值

    高阶函数

    • 把Lambda表达式作为参数挥着返回值的函数 就是高阶函数
      高阶函数的作用:简化代码 提高开发效率
    1. 函数作为参数使用
    fun main() {
        // 定义一个区间
        var range = 1..30
        // 获取区间中可以被5整除的值的集合
        /*val list = range.pickNum1({
            it % 5 == 0
        })*/
        // 优化 省略小括号 前提是:必须只有一个参数 并且参数是函数参数
        /*val list = range.pickNum1 {
            it % 5 == 0
        }*/
        // 优化 括号前移 可以将函数参数移动到小括号外面
        val list = range.pickNum1() {
            it % 5 == 0
        }
        println(list)
        val list1 = range.pickNum2(2, {
            it % 5 == 0
        })
        val list2 = range.pickNum2(2) {
            it % 5 == 0
        }
        println(list1)
        println(list2)
        // 如果Lambda表达式中只有一个参数 可以直接用it 不需要指定参数
    }
    
    // 把符合条件的元素从区间里面过滤出来
    // 参数funT 类型:(Int)->Boolean 函数参数
    // 函数参数类型是 Int 返回值类型是 Boolean
    // funT 形式的参数名 可以任意修改
    fun IntRange.pickNum1(funT: (Int) -> Boolean): List<Int> {
        var mutableList = mutableListOf<Int>()
        for (value in this) {// this 指向定义的区间(IntRange)范围1..30
            if (funT(value)) {// 判断传过来的表达式是否满足条件
                mutableList.add(value)// 符合条件的值添加进集合中
            }
        }
        return mutableList// 将最终的结果返回
    }
    
    fun IntRange.pickNum2(num: Int, funT: (Int) -> Boolean): List<Int> {
        var mutableList = mutableListOf<Int>()
        for (value in this) {// this 指向定义的区间(IntRange)范围1..30
            if (funT(value)) {// 判断传过来的表达式是否满足条件
                mutableList.add(value)// 符合条件的值添加进集合中
            }
        }
        return mutableList// 将最终的结果返回
    }
    
    1. 函数作为返回值使用
    fun main() {
        val normalPer = getPriceDou(USERTYPE.NORMAL)(22.5)
        println(normalPer)
        val vipPer = getPriceDou(USERTYPE.VIP)(33.4)
        println(vipPer)
    }
    
    // 普通用户 vip用户
    enum class USERTYPE {// 声明枚举 定义两种类型
        NORMAL,
        VIP
    }
    // 获取用户折扣
    // 返回值是函数
    fun getPriceDou(userType: USERTYPE): (Double) -> Double {
        if (userType == USERTYPE.NORMAL) {
            return { price ->
                price// 返回不打折金额
            }
        } else {
            return { priceVip ->
                0.8 * priceVip// 返回vip打折后的金额
            }
        }
    }
    

    标准库中的高阶函数

    内联函数

    总结

    后续继续更新

    相关文章

      网友评论

        本文标题:Lambda

        本文链接:https://www.haomeiwen.com/subject/aoeoiktx.html