Kotlin

Lambda

2020-11-25  本文已影响0人  码农修行之路

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)
}

高阶函数

  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打折后的金额
        }
    }
}

标准库中的高阶函数

内联函数

总结

后续继续更新

上一篇下一篇

猜你喜欢

热点阅读