Kotlin学习6.2:Lambda的特性

Kotlin学习6.2:Lambda的特性


(一)如果函数的最后一个参数接受函数,那么传入的 Lambda 表达式可以放在圆括号之外:

fun calculate(a: Int, b: Int, cal: (Int, Int) -> Int) {
    print("a + b = ${cal(a, b)}")
}
fun main(args: Array<String>) {
    calculate(1, 1) { a, b -> a + b }
}

在这里插入图片描述
(二)如果 Lambda 表达式只有一个参数,并且编译器自己可以识别出签名,也可以不用声明唯一的参数并忽略->, 该参数会隐式声明为it:

fun calculate(a: Int, cal: (Int) -> Int) {
    print(cal(a))
}
fun main(args: Array<String>) {
    calculate(2) { it * it }
}

在这里插入图片描述
(三)如果 Lambda 表达式没有参数,也可以忽略->, 并且不会隐式声明参数it,可参考下一点的例子。
(四)如果 Lambda 表达式是调用时唯一的参数,那么圆括号也可以省略:

fun myPrint(p: () -> Unit) {
    p()
}
fun main(args: Array<String>) {
    myPrint {
        print("timestamp is ${System.currentTimeMillis()}")
    }
}

在这里插入图片描述
(五)Lambda 表达式将隐式返回最后一个表达式的值,但可以使用限定的返回语法,即通过标签显式返回一个值:

fun calculate(a: Int, cal: (Int) -> Int) {
    print(cal(a))
}
fun main(args: Array<String>) {
    calculate(2) {
        it * it
    }
    calculate(2) {
        return@calculate it * it
    }
}

在这里插入图片描述
(六)从 Kotlin1.1 起,如果 Lambda 表达式的参数未使用,则可以用下划线代替其名称:

fun calculate(a: Int, b: Int, cal: (Int, Int) -> Int) {
    print(cal(a, b))
}
fun main(args: Array<String>) {
    calculate(1, 2) { _, b ->
        println("a 参数未使用")
        b * b
    }
}

在这里插入图片描述
(七)从 Kotlin1.1 起,Lambda 表达式参数支持解构声明语法,我们通过 Kotlin 内置的forEach()方法遍历map来测试:

fun main(args: Array<String>) {
    val map = mapOf(1 to 1, 2 to 2, 3 to 3)
    map.forEach {
        println("${it.key} to ${it.value}")
    }
    // 显示声明it参数的类型
    map.forEach { entry: Map.Entry<Int, Int> ->
        println("${entry.key} to ${entry.value}")
    }
    // 将Map.Entry类型的it参数解构
    map.forEach { (k, v) ->
        println("$k to $v")
    }
}

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值