本文地址


Kotlin 函数式编程

编程范式

函数式编程是一个跟面向对象编程类似的概念,它也是软件工程中的一种编程范式,它是声明式编程的一种,与它相反的叫做命令式编程

  • 声明式编程 Declarative Programming
    • 函数式编程 Functional Programming
  • 命令式编程 Imperative Programming
    • 面向对象编程 Object Oriented Programming
    • 面向过程编程 Process Oriented Programming

Kotlin 朱涛 思维-1 函数式思维 命令式 声明式

两种编程范式的区别

  • 命令式编程:在编程的时候,告诉计算机每一步具体都要干什么,每一步的细节都需要我们去实现
  • 声明式编程:在编程的时候,只需声明我们想要什么,而不关心具体的实现细节
    • 可以使用标准库中的方法实现,也可以自己定义一个方法实现
    • 优点:
      • 开发效率高,代码更简洁,可读性更强
      • 由于具有不变性、无状态等特点,更适合并发编程
    • 缺点:
      • 学习曲线十分陡峭、反直觉
      • 由于自身特性的限制,往往会导致性能更差

初识 Kotlin 函数式编程

Kotlin 作为一门刚出生不久的语言,它融合了很多现代化语言的特性,它在支持命令式编程的同时,也对函数式编程有着天然的亲和力。

函数式编程在数学理论上的定义很复杂,而对于初次接触 Kotlin 函数式编程来说,只需要记住两个重点:

  • 函数是一等公民
    • 函数可以独立于类之外 -- 顶层函数
    • 函数可以作为参数和返回值 -- 高阶函数和 Lambda
    • 函数可以像变量一样引用
    • 函数内部可以嵌套一个函数
  • 必须是纯函数
    • 函数不能有副作用:函数不应该修改任何变量
    • 无副作用的函数具有幂等性:函数调用 N 次的效果是等价的
    • 无副作用的函数具有引用透明的特性
    • 无副作用的函数具有无状态的特性

所谓不能有副作用就是:对函数作用域以外的数据进行修改。
函数式的不变性:在函数式编程当中,我们不应该修改任何变量;当我们需要修改变量的时候,我们要创建一份新的拷贝再修改。

实战:函数式的循环

如果不使用 for 循环,仅仅只使用函数,该如何实现循环功能呢?答案是:使用 递归

fun recursionLoop(max: Int): Int {
    fun go(i: Int, sum: Int): Int = if (i > max) sum else go(i + 1, sum + i)
    return go(1, 0)
}

递归都是有调用栈开销的,所以我们应该尽量使用尾递归。尾递归在经过栈复用优化以后,它的开销就可以忽略不计了,空间复杂度可以认为是 O(1)

fun recursionLoop(max: Int): Int {
    tailrec fun go(i: Int, sum: Int): Int = if (i > max) sum else go(i + 1, sum + i)
    return go(1, 0)
}

PA:上面的递归思路只是为了说明,我们可以用函数递归替代循环,而在实际的开发工作中,这种方式是不推荐的。如果有类似的需求,可以使用 Kotlin 的集合操作符:

fun reduce() = (1..10).reduce { acc, i -> acc + i } // 方案一
fun sum() = (1..10).sum()                           // 方案二

Kotlin 官方一直宣扬自己是支持多种编程范式的语言,所以,面对不同的问题时,我们可以灵活选择不同的范式进行编程。

小结

  • Kotlin 并没有完全拥抱函数式编程,它只是在一些语法设计上,借鉴了函数式编程的思想,而且这种借鉴的行为也十分克制,比如模式匹配、类型类、单子
  • 函数式编程领域的很多高级概念,Kotlin 也都没有天然支持,需要我们自己去实现。对比起 Scala 等其他 JVM 的现代语言,Kotlin 也显得更加务实,有点博采众长的意味

Kotlin 函数式编程目前仍未成为主流。不过,随着 2021 年 Android 推出 Jetpack Compose 声明式 UI 框架,以及 Kotlin 官方推出的 Compose Multiplatform 以后,Kotlin 函数式编程的关注度也被推向了一个前所未有的高度。相信在不久的将来,Kotlin 函数式编程的方式,一定会被更多的人认可和接受。

2017-05-31

相关文章:

  • 2021-12-01
  • 2022-12-23
  • 2021-07-07
  • 2022-02-26
  • 2022-12-23
  • 2021-09-01
  • 2021-12-20
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-03-07
  • 2021-06-27
  • 2021-07-15
  • 2021-06-07
相关资源
相似解决方案