Lambda表达式
- Lambda表达式其实是一个匿名函数,是对匿名内部类的一种简化
- Lambda表达式是函数式编程的基础
- 所谓的函数式编程实际上就是一种编程规范,即如何编写程序的方法论
- 函数式编程的思想是将电脑运算视为函数的计算,并且计算的函数可以接收函数作为输入参数或当作返回值来使用,使用函数式编程可以减少代码的重复,提高程序的开发效率
Lambda表达式相对于普通函数的区别:
- 普通函数有四种返回值类型:无参无返回值、无参有返回值、有参有返回值、有参无返回值
- 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表达式作为参数挥着返回值的函数 就是高阶函数
高阶函数的作用:简化代码 提高开发效率
- 函数作为参数使用
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// 将最终的结果返回
}
- 函数作为返回值使用
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打折后的金额
}
}
}
标准库中的高阶函数
内联函数
总结
后续继续更新
网友评论