kotlin - lambda表达式

kotlin - lambda表达式

使用lambda表达式代替局部函数

lambda表达式可以简化代码。比如现在我们要定义一个函数,根据不同的type来确定返回求平方、求立方、求阶乘的函数的应用。如下代码:

//定义函数,该函数的返回值类型为 Int
fun qetMathFunc(type: String): (Int) -> Int {
    when (type) {
        //调用局部函数
        " square" -> return { n: Int -> n * n }
        "cube" -> return { n: Int -> n * n * n }
        else -> return { n: Int ->
            var result = 1
            for (index in 2..n) {
                result *= index
            }
            result
        }
    }
}

lambda表达式与局部函数的区别

  • Lambda 表达式总是被大括号括着
  • 定义 Lambda 表达式不需要 fun 关键字,无须指定函数名。
  • 形参列表(如果有的话)在->之前声明,参数类型可以省略。
  • 函数体(Lambda 表达式执行体)放在->之后。
  • 函数的最后一个表达式自动被作为Lambda 表达式的返回值,无须使用 return 关键字。

lambda表达式

lambda表达式语法

Kotlin 提供了简洁的Lambda 表达式语法, Lambda 表达式的标准语法如下:

{(形参列表)->
    //0条或者多条执行语句
}

无参数的写法:

val 变量名={操作代码}

有参数的写法:

val/var 变量名: (参数的类型,参数类型,...) -> 返回值类型 = {参数1,参数2... -> 操作参数的代码 }
可等价于
 // 此种写法:即表达式的返回值类型会根据操作的代码自推导出来。
val/var 变量名 = { 参数1:类型,参数2:类型, ... -> 操作参数的代码 }

Lambda表达式与局部函数及其相似,我们在开发中一般用lambda表达式来代替局部函数。Lambda表达式的本质其实还是局部函数。
注意:lambda中的参数是不需要括号的,如果使用括号那就是使用解构。至于什么是解构在《类与对象》中会讲到。

实例讲解

  • 无参数的情况
// 源代码
fun test(){ println("无参数") }

// lambda代码
val test = { println("无参数") }

// 调用
test()  => 结果为:无参数

无参数的情况时参数可以省略

  • 有参数的情况
// 源代码
fun test(a : Int , b : Int) : Int{
    return a + b
}

// lambda
val test1 : (Int , Int) -> Int = {a , b -> a + b}
// 或者
val test2 = {a : Int , b : Int -> a + b}

// 调用
test(3,5) => 结果为:8

从代码中可以看出,如果定义变量时指明了参数类型,那么后面的lambda表达式{}里面可以省略参数类型,因为编译器可以从上下文推断出参数的类型。如果编译器不能从上下文中推断出参数类型,那么参数类型必须要指明。

  • 作为方法的参数
// lambda
fun test(a : Int , b : ( Int ,Int) -> Int) : Int{
    return a + b.invoke(3,5)
}
//调用
test(10,{ num1: Int, num2: Int ->  num1 + num2 })
//等价于:
test(10){ num1: Int, num2: Int ->  num1 + num2 } 
  • 从上面的代码可以看出在如果函数的最后一个参数是一个lambda表达式,可以把lambda表达式提出到括号外面。
  • b.invoke()等价于b()
  • 如果一个lambda表达式作为一个函数的参数时,定义的时候只是指定了这个表达式的参数类型和返回值,所以我们在调用高阶函数的时候要传入该Lambda表达式具体的实现。
    **由于lambda表达式只一个功能灵活的代码块,所以我们完全可以把它赋值给一个变量或直接调用lambda表达式。**示例代码如下:
fun main(args: Array<String>) {
    //定义一个 Lambda 表达式,并在它后面添加括号来调用该 Lambda 表达式
    val result = { base: Int, exponent: Int ->
        var result = 1
        for (i in 1..exponent) {
            result *= base
        }
        result
    }(4, 3)
    println(result) //输出 64
}

lambda表达式中的it

定义只有一个参数的匿名函数时,可以省略参数名用it来代替。代码如下:

fun main(args: Array<String>) {
    var square: (Int) -> Int = {it * it}
}

lambda表达式与匿名函数的return

  • 匿名函数只是一个没有名字的函数,本质上还是一个函数,因此匿名函数的return返回的是匿名函数本身。
  • lambda表达式他只是一个代码块return返回的是它所在的函数,而不是lambda表达式。 例如下面代码:
fun main(args: Array<String>) {
    var list = listOf(1,2,3,4,5)
    //匿名函数
    list.forEach(fun(value){
        println("元素为:${value}")
        return
    })
    //lambda表达式
    list.forEach {
        println("元素为:${it}")
        return
    }
}

lambda表达式打印结果如下:

元素为:1

匿名函数打印的结果:

元素为:1
元素为:2
元素为:3
元素为:4
元素为:5

从上面函数的打印结果可以验证,我们上面所说的结论,lambda表达式中的return直接返回它所在的函数。lambda表达式一般不写return,如果非得在lambda表达式中使用return语句来返回lambda表达式,可以使用如下方式:

list.forEach {
    println("元素为:${it}")
    return@forEach
}
回答: 在Kotlin中,Lambda表达式是一种简洁的方式来定义函数。通过使用Lambda表达式,我们可以将函数作为参数传递给其他函数,或者在需要函数作为返回值的地方使用它们。Lambda表达式的基本语法是使用箭头符号(->)将参数列表和函数体分隔开。例如:{参数列表 -> 函数体}。当Lambda表达式中只有一个参数时,可以使用it关键字来表示该参数,而不需要指定参数名。这是Kotlin语言的约定。此外,在Kotlin中还存在一种称为"尾随Lambda表达式"或"末尾Lambda表达式"的语法,当一个函数的最后一个参数是一个函数类型时,我们可以将Lambda表达式写在大括号内,而不是传递给函数的圆括号内。这种语法可以进一步简化代码。Lambda表达式Kotlin中被广泛运用,尤其在Android开发中,它能够减少代码量并提高开发效率。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Kotlin——高级篇(一):Lambda表达式详解](https://blog.csdn.net/weixin_30376453/article/details/95751745)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [kotlinlambda表达式](https://blog.csdn.net/flytosky21/article/details/130030489)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值