当前位置:网站首页>Lambda表达式
Lambda表达式
2022-07-30 22:57:00 【尘心平】

高阶函数
高阶函数是指Kotlin中参数为另一函数或者返回值为函数的函数
具体例子见下代码块
fun printArr(arr:Array<Int>,f:(Array<Int>)->Unit){ //函数作为参数 f(arr) } fun main(args:Array<String>){ val doPoint:(Array<Int>)->Unit={ for (x in it){ print("$x ") } println() } val arr= arrayOf(1,3,5,7,9) printArr(arr,doPoint) }
函数类型
Kotlin中的函数类型为 (参数类型) ->返回值类型
参数为空时,参数类型可省略不写,即()->返回值类型,但无返回值类型时,->后要写Unit
当函数类型为可空时的声明是:((参数类型)->返回值类型)?
函数类型允许套用,套用时->是右结合
上一节中的类型别名也可以用到函数类型这里
函数类型的实例化
函数类型的实例化方法有很多,这里主要介绍匿名函数、Lambda表达式和类构造三种方法
1.匿名函数
匿名函数的声明定义与常规类型类似,只是省去了函数名称
fun (参数):返回值{ 方法体 } 当参数类型和返回值类型可以推断到时可省略不写
val doPoint:(Array<Int>)->Unit=fun (arr:Array<Int>){ for (x in arr){ print("$x ") } }通过匿名函数的返回值即可调用该匿名函数
2.类构造
构建类型为函数类型的类,覆盖invoke方法,构建类对象调用invoke方法即可
fun printArr(arr:Array<Int>,f:(Array<Int>)->Unit){ f.invoke(arr) } class doPointClass:(Array<Int>)->Unit{ override fun invoke(p1: Array<Int>) { for (x in p1){ print("$x ") } println() } } fun main(args:Array<String>){ val b=doPointClass() val arr= arrayOf(1,3,5,7,9) printArr(arr,b) }3.Lambda方法在下一标题详细介绍
内联函数
当使用高阶函数时,因为Kotlin中一切皆为对象,所以函数作为参数或函数作为返回值会造成一些运行效率的损失,比如内存分配时需要额外分配函数对象所占的内存,增加了运行时间的开销。类似上述代码,传参时还需定义值为函数体的变量
为解决高阶函数的效率问题,引入了内联函数inline
inline修饰符将影响被修饰函数本身和传给它的lambda表达式:所有这些都将内联到调用处。
inline fun printArr(arr:Array<Int>, f:(Array<Int>)->Unit){ f(arr) } fun main(args:Array<String>){ val arr= arrayOf(1,3,5,7,9) printArr(arr) { for (x in it) { print("$x ") } }//Lambda表达式提出至()外 }
Lambda函数
Lambda表达式语法具体是:{参数 ->方法体}
当Lambda表达式的函数类型返回值定义不是Unit时,{}内最后一个表达式作为返回值
视为return 该表达式
1.传递末尾的lambda表达式
当函数的最后一个参数为函数时,该函数的lambda实现可以放到()外
inline fun printArr(arr:Array<Int>, f:(Array<Int>)->Unit){ f(arr) } fun main(args:Array<String>){ val arr= arrayOf(1,3,5,7,9) printArr(arr){for (x in it) print("$x ") } //传递末尾的lambda表达式 }2.当lambda表达式的函数类型定义为只有一个参数时,可用 it 隐式指代
代码示例见1
3.当lambda表达式参数有多个,则须在{ }内先给出参数名和参数类型,再在->后接函数体
inline fun arrPlus(arr:Array<Int>,arr1:Array<Int>,f:(Array<Int>,Array<Int>)->Array<Int>){ val res=f(arr,arr1) for (x in res) print("$x ") println() } fun main(args:Array<String>){ val arr= arrayOf(1,3,5,7,9) val arr1= arrayOf(2,4,6,8,10) arrPlus(arr,arr1){ arr,arr1-> val minSize=if(arr.size<arr1.size) arr.size else arr1.size for (i in 0 until minSize) arr[i]+=arr1[i] arr } }
边栏推荐
- MySQL的一个问题
- Apache Doris series: detailed steps for installation and deployment
- "Wei cup" school more than 2022 cattle summer camp 4 Nancy (polocy) pelosi article variance law of Arts
- 第一节 zadig 入门
- Introducing the visualization tool Netron
- “蔚来杯“2022牛客暑期多校训练营4 N.Particle Arts 规律 方差
- mysql获取当前时间
- TCP 连接 三次握手 四次挥手
- 【MySQL】DQL相关操作
- The problem of sticky packets in tcp protocol transmission
猜你喜欢
![[MySQL] Mysql transaction and authority management](/img/a5/c92e0404c6a970a62595bc7a3b68cd.gif)
[MySQL] Mysql transaction and authority management

WSL安装图形界面并通过xrdp/X-Launch访问

MySQL进阶sql性能分析

Computer shortcut icon whitening solution

【云驻共创】HCSD大咖直播–就业指南

【LeetCode】70. 爬楼梯 - Go 语言题解

阿里云视频点播+项目实战

Excel基础学习笔记

mysql跨库关联查询(dblink)

ThinkPHP high imitation blue play cloud network disk system source code / docking easy payment system program
随机推荐
tcp协议传输中的粘包问题
Compressing Deep Graph Neural Networks via Adversarial Knowledge Distillation
PyTorch模型导出到ONNX文件示例(LeNet-5)
力扣题(2)—— 两数相加
$\text{ARC 145}$
Go语学习笔记 - gorm使用 - 事务操作 Web框架Gin(十一)
HF2022-EzPHP reproduction
[MySQL] DQL related operations
win10重建索引
IDEA usage skills
“蔚来杯“2022牛客暑期多校训练营4 L.Black Hole 垃圾计算几何
Gxlcms有声小说系统/小说听书系统源码
2022 Nioke Summer Multi-School Training Camp 1 J Serval and Essay
d违反常了吗
"Code execution cannot continue because MSVCP140.dll was not found, reinstalling the program may resolve the problem, etc." Solutions
Reverse linked list - in-place inversion method
只会纯硬件,让我有点慌
EasyExcel comprehensive course combat
Go语学习笔记 - gorm使用 - gorm处理错误 Web框架Gin(十)
ML之shap:基于FIFA 2018 Statistics(2018年俄罗斯世界杯足球赛)球队比赛之星分类预测数据集利用RF随机森林+计算SHAP值单样本力图/依赖关系贡献图可视化实现可解释性之攻略