- 快召唤伙伴们来围观吧
- 微博 QQ QQ空间 贴吧
- 文档嵌入链接
- 复制
- 微信扫一扫分享
- 已成功复制到剪贴板
Kotlin函数式编程
Kotlin 函数式编程
⼀. 函数类型
⼆. lambda 表达式
三. ⾼阶函数
四. 实战
展开查看详情
1 .Kotlin 函数式编程 乔禹昂
2 .⾃自我介绍 Android ⼯工程师 Kotlin 传教⼠士 Kotlin 中⽂文站译者 Kotlin 中⽂文社区运营
3 . 什什么是函数式编程? “⼀一种编程范式,与“⾯面向对象编程”, 以及“⾯面向过程编程”在层次上是类似的概念。”
4 .⼀一个直观的例例⼦子
5 .SAM 接⼝口
6 . 函数式编程能做到什什么? 简单的说:“可以把函数(或⼀一个代码块)作为对象传 递(例例如作为另⼀一个函数或代码块的参数或返回值)”
7 . 内容提要 • ⼀一. 函数类型 • ⼆二. lambda 表达式 • 三. ⾼高阶函数 • 四. 实战
8 .⼀一. 函数类型
9 . 哪些因素决定了了函数类型? • 1.接收者类型(成员函数、扩展函数) • 2.参数类型 • 3.返回值类型
10 . ⼀一个例例⼦子 接收者 参数 返回值
11 .⼀一个简单的⾼高阶函数
12 .函数类型的继承关系 (Fruit) -> Animal 继承 继承 这三个函数类型之间 有继承关系吗? (Apple) -> Dog 继承 继承 (Fuji) -> Samoyed
13 .函数类型的继承关系 in out ⽗父类 (Apple) -> Dog 继承 继承 ⼦子类 (Fruit) -> Samoyed
14 . in(参数) out(返回值) ⽗父类 (Apple) -> Dog 只接收苹果的购物⻋车 可以养各种狗的狗屋 ⼦子类 (Fruit) -> Samoyed 能接收各种⽔水果的购物⻋车购物⻋车 只养萨摩耶的狗屋
15 .
16 .成员引⽤用
17 .成员引⽤用
18 . ⼆二. lambda 表达式 • lambda 表达式就是⼀一个拥有函数类型的代码块 • lambda 表达式是⼀一种更更灵活的函数
19 . 编写⼀一个 lambda // 将⼀一个 lambda 表达式赋值给⼀一个变量量 val a = { x: Int, y: Int -> /* 花括号的范围即是 println(“$x $y”) /* 根据第⼀一⾏行行和最后 ⼀一⾏行行可以推断出,该 lambda 的范围 */ (x + y).toDouble() lambda 的类型是: (Int, Int) -> Double */ } // lambda 的最后⼀一⾏行行就是该 lambda 的返回值
20 .将lambda传递给⾼高阶函数
21 .lambda 表达式应⽤用
22 .Kotlin lambda 表达式是如何在 JVM 上实现的?
23 . Java 中的相关原理理 • Java 的匿匿名类原理理:匿匿名类在编译期会⽣生成新的 .class ⽂文 件。 • Java 8 的 lambda 表达式原理理:编译期不不产⽣生额外结果, 在运⾏行行时会⽣生成⼀一个静态⽅方法,将 lambda 表达式的代码保 存在静态⽅方法中,然后⽣生成⼀一个 SAM 接⼝口的实现类,在该 实现类中会调⽤用之前⽣生成的静态⽅方法。class 字节码调⽤用指 令使⽤用的是 Java 7 新增的 invokeDynamic。
24 . 两种实现的优缺点 • 匿匿名类:频繁使⽤用匿匿名类会在编译期创建⼤大量量 class ⽂文件, 导致程序包变⼤大,但运⾏行行时没有其它开销。 • lambda:在编译期不不会做额外⼯工作,即不不会让程序包变 ⼤大,但在运⾏行行时会动态⽣生成代码,拖慢运⾏行行时的速度。
25 . Kotlin 的选择 • Kotlin ⽬目前的 lambda 表达式在编译后会⽣生成名为 FunctionN 接⼝口的匿匿名类(⽆无论配置的Java target 版本是 多少)。 • Kotlin 未来计划会⽀支持 Java 8 lambda 表达式的字节码。
26 .FunctionN
27 .例例⼦子:Kotlin
28 .例例⼦子:编译结果
29 .三.⾼高阶函数 “⼀一种接受函数作为参数或返回值的函数”