(五)Kotlin简单易学 基础语法-初始函数(下)
(五)Kotlin简单易学 基础语法-初始函数(下)
函数内联
➢ lambda可以让你更灵活的编写应用,但是,灵活也要付出代价的。
➢在JVM上,你定义的lambda会以对象实例的形式存在,JVM会为所有同lambda打交道的变量分配内存,这就产生内存开销。更糟的是,lambda的内存开销会带来严重的性能问题。幸运的是,kotlin有一种优化机制叫内联,有了内联,JVM就不需要使用lambda对象实例了,因而避免了变量内存分配。哪里需要使用lambda,编译器就会将函数体复制粘贴到哪里。
➢使用lambda的递归函数无法内联,因为会导致复制粘贴无限循环,编译会发出警告。
哪里需要使用lambda,编译器就会将函数体复制粘贴到哪里。如下图,在Kotlin中,编译器将lambda表达式转化java代码:
函数引用
➢ 要把函数作为参数传给其他函数使用,除了传lambda表达式,kotlin还提供了其他方法,传递函数引用,函数引用就可以把一个具名函数转换成一个值参,使用lambda表达式的地方,都可以使用函数引用。
代码示例:
fun main() {//使用lambda表达式的地方,都可以使用函数引用。getDiscountWords函数引用showOnBoard("牙膏",::getDiscountWords)
}fun getDiscountWords(goodName: String,hour:Int):String{val currentYear =2027return "${currentYear}年,双11${goodName}促销倒计时:$hour 小时"
}fun showOnBoard(goodName: String, getDiscountWords: (String, Int) -> String) {val hour = (1..24).shuffled().last()print(getDiscountWords(goodName,hour))
}
函数类型作为返回类型
➢ 函数类型也是有效的返回类型,也就是说可以定义一个能返回函数的函数。
fun main() {val getDiscountWords = configDiscountWords()print(getDiscountWords("沐浴露"))
}
//定义一个能返回函数的函数。返回函数String 结果返回String
fun configDiscountWords():(String)->String{val currentYear =2017val hour = (1..24).shuffled().last()return {goodsName:String->"${currentYear}年,双11${goodsName}促销倒计时: $hour 小时"}
}
闭包
➢在kotlin中,匿名函数能修改并引用定义在自己的作用域之外的变量,匿名函数引用着定义自身的函数里的变量,Kotlin中的lambda就是闭包。
➢能接受函数或者返回函数的函数又叫高级函数,高级函数广泛应用于函数式编程当中。
如下图,在return 这段代码 (也称匿名函数)引用自己的作用域之外的变量,就称之为闭包。
fun configDiscountWords():(String)->String{val currentYear =2017val hour = (1..24).shuffled().last()return {goodsName:String->"${currentYear}年,双11${goodsName}促销倒计时: $hour 小时"}
}
再清楚点,如下图function3称之为闭包,所有function1,function2是不可直接访问function3
lambda与匿名内部类
➢为什么要在代码中使用函数类型?函数类型能让开发者少写模式化代码,写出更灵活的代码。在java8支持面向对象编程和lambda表达式,但不支持将函数作为参数传给另一个函数或变量,不过java的替代方案是匿名内部类。
两者相比
java 匿名内部类 | kotlin匿名内部类 |
---|---|
模式化代码太多 | 代码灵活简洁 |
java匿名内部类
public class JavaAnonymousClass {public static void main(String[] args) {showOnBoard("牙膏", new DiscountWords() {@Overridepublic String getDiscountWords(String goodName, int hour) {int currentYear =2017;return String.format(String.format("%d年,双11%s促销倒计时: %d 小时",currentYear,hour));}});}public interface DiscountWords{String getDiscountWords(String goodName,int hour);}public static void showOnBoard(String goodName,DiscountWords discountWords){int hour = new Random().nextInt(24);System.out.printf(discountWords.getDiscountWords(goodName,hour));}
}
kotlin匿名内部类
fun main() {showOnBoard("卫生纸"){goodName:String ,hour:Int->val currentYear = 2027"${currentYear}年,双11${goodName}促销倒计时: $hour 小时"}
}private fun showOnBoard(goodName:String,getDiscountWords:(String,Int)->String){val hour = (1..24).shuffled().last()print(getDiscountWords(goodName,hour))
}
(五)Kotlin简单易学 基础语法-初始函数(下)相关推荐
- (二十三)Kotlin简单易学 基础语法-什么是函数式编程
(二十三)Kotlin简单易学 基础语法-什么是函数式编程 什么是函数式编程 我们一直在学习面向对象编程范式,另一个较知名的编程范式是诞生于20世纪50年代,基于抽象数学的λ演算发展而来的函数编程,尽 ...
- openresty开发系列14--lua基础语法3函数
openresty开发系列14--lua基础语法3函数 一)function (函数) 有名函数: optional_function_scope function function_name( ar ...
- python导入模块的语法结构_python学习第五讲,python基础语法之函数语法,与Import导入模块....
python学习第五讲,python基础语法之函数语法,与Import导入模块. 一丶函数简介 函数,就是一个代码块,这个代码块是别人写好的.我们调用就可以. 函数也可以称为方法. 1.函数语法定义 ...
- Kotlin系列之基础语法
标签: Kotlin Kotlin基础语法 目录: 一.包的声明 二.函数的定义 三.常量和变量 四.注释 五.字符串模板 六.使用条件表达式 七.NULL检查机制 八.类型检测以及自动类型 ...
- PHP入门指南:简单易学的语法和丰富的调试工具与安全性最佳实践
PHP是一种非常流行的服务器端编程语言,它被广泛地应用于Web开发中.如果您想学习Web开发,那么PHP是一个非常好的选择.在本文中,我将介绍PHP的一些基础知识,包括语法.变量.函数.数组.数据库连 ...
- Kotlin 开篇之基础语法篇
文章目录 前言 Kotlin 基础 1. 函数声明 1.1 表达式函数体 1.2 函数调用 2. 变量 2.1 可变变量和不可变量 2.2 引用变量值 2.3 空安全 3. 基础类型 3.1 数字类型 ...
- T-Bootstrap-day04-组件、boot的定制、scss基础语法和函数
文章目录 一.常用组件 二.其他组件 boot的定制 一.SCSS,动态的样式语言(nodejs 8.11以上) 二.scss基础语法 三.scss的函数 四.指令(if-else) 一.常用组件 卡 ...
- python字典均值_Python常用基础语法(函数)汇总
重点( 要求 ): 1.理解语法( 函数 )的作用. 2.理解语法( 函数 )运用举例的代码块. 一.修改字符串(针对英文字符串)大小写. (1)title() : 将字符串(英文)开头字母装换为大写 ...
- 2021年大数据常用语言Scala(十三):基础语法学习 函数 重点掌握
目录 函数 重点掌握 定义函数 方法和函数的区别 方法转换为函数 完全体函数 函数 重点掌握 scala支持函数式编程,将来编写Spark/Flink程序中,会大量使用到函数 函数和我们的对象一样, ...
最新文章
- StaticFactoryMethod_Level3
- iOS:切换视图的第三种方式:UITabBarController标签栏控制器
- python shell怎么换行_python shell:去除fasta文件的换行符
- 机器人学习--全局定位(阿尔伯塔大学张宏教授报告)
- 可申请试用!GN4系列GPU云服务器重磅来袭
- Web.config中连接字符串的加密和解密[转载]
- VTK:Qt之QImageToImageSource
- [转] Tomcat 系统架构与设计模式,第 1 部分: 工作原理
- WinAPI-CreateMutex(双开)
- python制作合同模板带图片_办公自动化7_用Python操作Word批量生成合同
- 苹果电脑如何修改环境变量
- android 图片编辑 画圈,Android种图片圆形化的三种方式
- jsp+aJax 登陆成功
- web——html个人简历
- GIS电力平台功能需求
- 支付宝网页支付(签名)
- 音频采集 via Media Foundation
- mysql++裸盘_绑定裸设备(查看裸设备的大小)
- 前端 js 深浅拷贝
- NLP-D23-cs224nkaggle房价预测复习chap5深度学习计算算法R2D7Unicorn
热门文章
- 15W无线充电芯片介绍
- 随机数字信号处理实验报告三——Levinson和Burg递推法MATLAB实现
- 6天面试、斩获6家硅谷巨头Offer,我是如何做到的?
- 怎样锁定计算机本地磁盘,win7系统本地磁盘加密的操作方法
- php用date语句获取时间,PHP date函数获取时间几个例子
- switch函数不加break的效果
- 站长常用的200个js代码
- 码市coding不能下载
- 哪个dns服务器延迟最低,可以立即测出延迟最小的DNS
- DataTables warning:table id = TableDate: Cannot reinitialise DataTable的解决办法