Kotlin中的Lambda表达式

我的新书《Android App开发入门与实战》已于2020年8月由人民邮电出版社出版,欢迎购买。点击进入详情

1.函数式编程

在理解lambda表达式之前,我们先了解下什么是函数式编程。

函数式编程是一种如何编写程序的方法论,它将电脑运算视为函数的运算,其主要思想是把运算过程尽量写成一系列的函数嵌套调用。

函数式编程的基础是Lambda(λ )演算,λ演算的函数可以接受函数当作输入(参数)和输出(返回值)。

相比于指令式编程(或叫命令式编程,Imperative),函数式编程(属于声明式编程,Declarative)更加注重函数的计算。
在这里插入图片描述
函数式编程的特点:

  1. 函数第一原则
    函数是第一公民,它可以出现在任何地方,比如可以把函数作为参数传递给另一个函数,也可以将函数作为返回值
    目前主流的编程语言,比如Java中的Lambda表达式和闭包,已经提供了对这种编程方式的支持。
    Kotlin本身就完美地支持函数式编程。

2.Lambda定义

前面介绍了函数式编程,其核心是λ演算,而Lambda表达式就是λ演算的一部分。
Lambda表达式其实就是将一段代码封装成匿名函数,以参数值的形式传递到函数中(第一公民),供函数使用。

接下来我们看看Lambda表达式的用法。
首先看看规则:
1. kotlin中lambda表达式定义在{}中
2. 其参数(如果存在)在 -> 之前声明(参数类型可以省略)
3. 函数体(如果存在)在 -> 后面

	//源代码:无参
    fun l1() {
    
    
        println("无参数")
    }
    //lambda表达式: 以值的形式传递
    val l1 = {
    
     println("无参数") }
    //调用
    l1()
    //源代码:有参
    fun l2(x: Int, y: String) {
    
    
        println(y.length + x)
    }
    //lambda表达式: 以值的形式传递
    val l2 = {
    
     x: Int, y: String -> println(y.length + x) }
    //调用
    l2(1, "Mike")
    //lambda表达式也可以直接通过run运行
    run {
    
     l2(1, "tom") }

3.Lambda应用: 高阶函数

kotlin中的高阶函数是可以将函数作为参数传递或者返回值返回的函数。

既然函数能作为参数,那么我们看看函数作为参数传递的规则:

  1. () -> Unit//表示无参数无返回值的Lambda表达式类型
  2. (T) -> Unit//表示接收一个T类型参数,无返回值的Lambda表达式类型
  3. (T) -> R//表示接收一个T类型参数,返回一个R类型值的Lambda表达式类型
//普通函数
fun add(x: Int = 0, y: Int = 0): Int {
    
    
    return x + y
}

//foo可以理解为这个lambda表达式的别名
fun operate(x: Int = 0 ,y: Int = 0, foo: (Int, Int) -> Int) {
    
    
    print("this result is " + body(x,y))
}
//可以用::调用函数
fun caculate(){
    
    
    operate(3,7, ::add2)
}
//也可以直接传入lambda表达式
fun caculate(){
    
    
    operate(3,7, {
    
    x, y -> x + y})
}

4.Lambda应用: 简化

	val people = listOf(User("张三", 18), User("李四", 20))
    //1.1 函数只有lambda一个实参
    //原始完整代码
    println("年纪最大:" + people.maxBy({
    
     user: User -> user.age }))
    //step1:如果lambda表达式是函数调用的最后一个实参,它可以放在括号外面
    println("年纪最大:" + people.maxBy() {
    
     user: User -> user.age })
    //step2: 当lambda是函数唯一的实参时,可以去掉函数调用的括号
    println("年纪最大:" + people.maxBy {
    
     user: User -> user.age })
    //step3:如果lambda的参数的类型可以推导,那么可以省略参数的类型
    println("年纪最大:" + people.maxBy {
    
     user -> user.age })
    //step4:对于lambda中一个参数时,可以使用默认参数名称it来代替命名参数,并且lambda的参数列表可以简化,省略参数列表和->
    println("年纪最大:" + people.maxBy {
    
     it.age })
    //1.2 函数有除了lambda外多个实参
    fun lambdaTest1(a: Int, b: (String) -> String) {
    
    
        println("$a + ${
      
      b(a.toString())}")
    }

    fun lambdaTest2(b: (String) -> String, a: Int) {
    
    
        println("$a + ${
      
      b(a.toString())}")
    }
	//调用
    lambdaTest1(11) {
    
    
        "hello: $it"
    }
	//调用
    lambdaTest2({
    
     "hello: $it" }, 22)

欢迎关注我的技术公众号:国民程序员,我们的目标:输出干货

  1. 每天分享原创技术文章
  2. 海量免费技术资料和视频学习资源
  3. 分享赚钱门道,带领程序员走向财务自由
图片名称

猜你喜欢

转载自blog.csdn.net/ddnosh/article/details/113841987
今日推荐