当前位置:网站首页>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 } }
边栏推荐
- 只会纯硬件,让我有点慌
- ML之shap:基于FIFA 2018 Statistics(2018年俄罗斯世界杯足球赛)球队比赛之星分类预测数据集利用RF随机森林+计算SHAP值单样本力图/依赖关系贡献图可视化实现可解释性之攻略
- DFS题单以及模板汇总
- Debezium error series 20: task failed to create new topic. Ensure that the task is authorized to create topics
- 一文详解:SRv6 Policy模型、算路及引流
- Apache Doris系列之:安装与部署详细步骤
- [MySQL] DQL related operations
- Abstract classes and interfaces (study notes)
- “蔚来杯“2022牛客暑期多校训练营4 DHKLN
- HF2022-EzPHP reproduction
猜你喜欢

Apache Doris series: In-depth understanding of real-time analytical database Apache Doris

宁波中宁典当转让29.5%股权为283.38万元,2021年所有者权益为968.75万元

二进制序列

【2022-05-31】JS逆向之易企秀

Go1.18升级功能 - 泛型 从零开始Go语言

EasyExcel comprehensive course combat

ThinkPHP high imitation blue play cloud network disk system source code / docking easy payment system program

# # yyds dry goods inventory interview will brush TOP101: to determine whether there is a part of the list

PyTorch模型导出到ONNX文件示例(LeNet-5)

PS Basic Learning (1)
随机推荐
【Untitled】
ZZULIOJ: 1120: the most value to exchange
阿里云视频点播+项目实战
【LeetCode】70. 爬楼梯 - Go 语言题解
[MySQL] Mysql transaction and authority management
MySQL联合查询(多表查询)
Py's pdpbox: a detailed introduction to pdpbox, installation, and case application
Excel basic study notes
Go语学习笔记 - gorm使用 - gorm处理错误 Web框架Gin(十)
Flex布局使用
DFS question list and template summary
【LeetCode】55. 跳跃游戏 - Go 语言题解
详解操作符
宁波中宁典当转让29.5%股权为283.38万元,2021年所有者权益为968.75万元
$\text{ARC 145}$
【MySQL】Mysql事务以及权限管理
grub learning
BFS题单总结
The problem of sticky packets in tcp protocol transmission
el-upload添加请求头