Kotlin的Lambda


学习了一下扔物线的kotlin的Lambda表达式,这里做一下记录

在这里插入图片描述

用函数作为参数

一般是不能以函数作为一个函数的参数的,但是如果我们想这么做的话,怎么实现:

  1. Java中,使用接口包装的方式实现,也就是常见的接收一个接口对象,然后调用接口的方法

  2. Kotlin中的写法:

     // 一个普通函数
     fun pp(param:Int):String{
         return "123"
     }
     // 接收一个函数作为参数
     fun add(funParam: (Int)->String){
         //TODO
     }
    
     如上面的,
     funParam表示是一个参数,
     (Int)表示它需要一个Int类型的参数
     ->String,表示它返回String类型的结果
    

高阶函数

Kotlin中的高阶函数的定义是,将函数用作参数或者返回值的函数
函数作为返回值的写法和作为参数的时候一样,要声明参数和返回值类型

函数类型对象与调用

在kotlin中,可以声明一个表示函数的变量,比如

// 一个普通函数
fun pp(param:Int):String{
    return "123"
}

//::pp指向一个函数类型对象,而不是函数本身
var ppObj = ::pp

// 函数调用
fun funObjInvoke(){
    //普通函数调用
    pp(1)
    //函数类型对象调用
    (::pp)(1)
    ppObj(1)
    //函数类型对象通过invoke调用
    ppObj.invoke(1)
}

上面的例子中:
pp是一个普通函数,
::pp是一个函数类型对象
ppObj是函数类型对象的引用

匿名函数

匿名函数就是没有函数名的函数,kotlin中可以直接赋值给一个变量

// 匿名函数(没有名称)
val a = fun(i:Int):String{
    return "123"
}

它可以赋值给一个变量,说明匿名函数本质上也是一个对象,是一个函数类型的对象

Lambda的写法与位置

lambda表达式的写法

官方文档的说法

lambda 表达式总是括在花括号中, 完整语法形式的参数声明放在花括号内,并有可选的类型标注, 函数体跟在一个 -> 符号之后

比如:

val sum = { x: Int, y: Int -> x + y }
{}内部的就是lambda表达式,->前面是参数声明,后面是函数体

比如,我们有一个函数和一个参数为函数的函数

// 匿名函数(没有名称)
val a = fun(i:Int):String{
    return "123"
}
//接收函数为参数的函数
fun af(param:(Int)->String){

}

如上,a是符合af的参数的函数,那么就可以使用匿名函数或者简化lambda表达式调用,如下

fun aInvoke(){
    //通过匿名函数对象调用
    af(a)
    //直接调用匿名函数
    af(fun(i:Int):String{ return "123" })
    //匿名函数简化为lambda表达式
    //代码块
    af({i:Int -> "123"})
    //lambda是最后一个参数,可以写在括号的外面
    af(){i:Int -> "123"}
    //lambda是函数唯一的参数,可以去掉函数的参数括号
    af{i:Int -> "123"}
    //lambda函数是单参数的,可以省略lambda函数的参数
    //kotlin语法糖,对省略的唯一参数命名为it
    af{it.toString()}
}

其他注意点

lambda返回值不能写return,是取最后一行代码的值
lambda也是一种函数类型的对象

kotlin的Lambda和Java的Lambda不同,Java的不是函数类型对象

扔物线视频

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值