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.三.⾼高阶函数 “⼀一种接受函数作为参数或返回值的函数”