(五)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简单易学 基础语法-初始函数(下)相关推荐

  1. (二十三)Kotlin简单易学 基础语法-什么是函数式编程

    (二十三)Kotlin简单易学 基础语法-什么是函数式编程 什么是函数式编程 我们一直在学习面向对象编程范式,另一个较知名的编程范式是诞生于20世纪50年代,基于抽象数学的λ演算发展而来的函数编程,尽 ...

  2. openresty开发系列14--lua基础语法3函数

    openresty开发系列14--lua基础语法3函数 一)function (函数) 有名函数: optional_function_scope function function_name( ar ...

  3. python导入模块的语法结构_python学习第五讲,python基础语法之函数语法,与Import导入模块....

    python学习第五讲,python基础语法之函数语法,与Import导入模块. 一丶函数简介 函数,就是一个代码块,这个代码块是别人写好的.我们调用就可以. 函数也可以称为方法. 1.函数语法定义 ...

  4. Kotlin系列之基础语法

    标签: Kotlin      Kotlin基础语法 目录: 一.包的声明 二.函数的定义 三.常量和变量 四.注释 五.字符串模板 六.使用条件表达式 七.NULL检查机制 八.类型检测以及自动类型 ...

  5. PHP入门指南:简单易学的语法和丰富的调试工具与安全性最佳实践

    PHP是一种非常流行的服务器端编程语言,它被广泛地应用于Web开发中.如果您想学习Web开发,那么PHP是一个非常好的选择.在本文中,我将介绍PHP的一些基础知识,包括语法.变量.函数.数组.数据库连 ...

  6. Kotlin 开篇之基础语法篇

    文章目录 前言 Kotlin 基础 1. 函数声明 1.1 表达式函数体 1.2 函数调用 2. 变量 2.1 可变变量和不可变量 2.2 引用变量值 2.3 空安全 3. 基础类型 3.1 数字类型 ...

  7. T-Bootstrap-day04-组件、boot的定制、scss基础语法和函数

    文章目录 一.常用组件 二.其他组件 boot的定制 一.SCSS,动态的样式语言(nodejs 8.11以上) 二.scss基础语法 三.scss的函数 四.指令(if-else) 一.常用组件 卡 ...

  8. python字典均值_Python常用基础语法(函数)汇总

    重点( 要求 ): 1.理解语法( 函数 )的作用. 2.理解语法( 函数 )运用举例的代码块. 一.修改字符串(针对英文字符串)大小写. (1)title() : 将字符串(英文)开头字母装换为大写 ...

  9. 2021年大数据常用语言Scala(十三):基础语法学习 函数 重点掌握

    目录 函数 重点掌握 定义函数 方法和函数的区别 方法转换为函数 完全体函数 函数 重点掌握 scala支持函数式编程,将来编写Spark/Flink程序中,会大量使用到函数 函数和我们的对象一样, ...

最新文章

  1. StaticFactoryMethod_Level3
  2. iOS:切换视图的第三种方式:UITabBarController标签栏控制器
  3. python shell怎么换行_python shell:去除fasta文件的换行符
  4. 机器人学习--全局定位(阿尔伯塔大学张宏教授报告)
  5. 可申请试用!GN4系列GPU云服务器重磅来袭
  6. Web.config中连接字符串的加密和解密[转载]
  7. VTK:Qt之QImageToImageSource
  8. [转] Tomcat 系统架构与设计模式,第 1 部分: 工作原理
  9. WinAPI-CreateMutex(双开)
  10. python制作合同模板带图片_办公自动化7_用Python操作Word批量生成合同
  11. 苹果电脑如何修改环境变量
  12. android 图片编辑 画圈,Android种图片圆形化的三种方式
  13. jsp+aJax 登陆成功
  14. web——html个人简历
  15. GIS电力平台功能需求
  16. 支付宝网页支付(签名)
  17. 音频采集 via Media Foundation
  18. mysql++裸盘_绑定裸设备(查看裸设备的大小)
  19. 前端 js 深浅拷贝
  20. NLP-D23-cs224nkaggle房价预测复习chap5深度学习计算算法R2D7Unicorn

热门文章

  1. 15W无线充电芯片介绍
  2. 随机数字信号处理实验报告三——Levinson和Burg递推法MATLAB实现
  3. 6天面试、斩获6家硅谷巨头Offer,我是如何做到的?
  4. 怎样锁定计算机本地磁盘,win7系统本地磁盘加密的操作方法
  5. php用date语句获取时间,PHP date函数获取时间几个例子
  6. switch函数不加break的效果
  7. 站长常用的200个js代码
  8. 码市coding不能下载
  9. 哪个dns服务器延迟最低,可以立即测出延迟最小的DNS
  10. DataTables warning:table id = TableDate: Cannot reinitialise DataTable的解决办法