当前位置:网站首页>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 } }
边栏推荐
- 【Untitled】
- IDEA usage skills
- Excel basic study notes
- 详解操作符
- Py之pdpbox:pdpbox的简介、安装、案例应用之详细攻略
- 482-静态库、动态库的制作、使用及区别
- Apache Doris系列之:安装与部署详细步骤
- 2021GDCPC广东省大学生程序设计竞赛 H.History
- "Code execution cannot continue because MSVCP140.dll was not found, reinstalling the program may resolve the problem, etc." Solutions
- 【LeetCode】70. 爬楼梯 - Go 语言题解
猜你喜欢
随机推荐
ML之shap:基于FIFA 2018 Statistics(2018年俄罗斯世界杯足球赛)球队比赛之星分类预测数据集利用RF随机森林+计算SHAP值单样本力图/依赖关系贡献图可视化实现可解释性之攻略
Ningbo Zhongning Pawn will transfer 29.5% of the equity for 2.8338 million yuan, and the owner's equity in 2021 will be 9.6875 million yuan
MySQL联合查询(多表查询)
IDEA usage skills
详解操作符
Day016 类和对象
2022.7.28
"Wei cup" school more than 2022 cattle summer camp 4 Nancy (polocy) pelosi article variance law of Arts
Computer shortcut icon whitening solution
“蔚来杯“2022牛客暑期多校训练营4 N.Particle Arts 规律 方差
QT 在父类中添加子类的流程,object tree,
2022 Nioke Summer Multi-School Training Camp 1 J Serval and Essay
d使用among的问题
Alibaba Cloud video on demand + project combat
Excel basic study notes
【无标题】
[MySQL] Related operations on databases and tables in MySQL
[SAM模板题] P3975 [TJOI2015] 弦论
力扣题(2)—— 两数相加
2022.7.27