End

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

本文地址


目录

Kotlin 函数式编程

编程范式

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

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

两种编程范式的区别

  • 命令式编程:在编程的时候,告诉计算机每一步具体都要干什么,每一步的细节都需要自己去实现
  • 声明式编程:在编程的时候,只需声明我们想要什么,而不关心具体的实现细节
    • 可以使用标准库中的方法实现,也可以自己定义一个方法实现

声明式编程的优缺点

  • 声明式编程的优点:
    • 开发效率高,代码更简洁,可读性更强
    • 具有不变性、无状态等特点,更适合并发编程
  • 声明式编程的缺点:
    • 学习曲线陡峭、反直觉
    • 由于自身特性的限制,往往会导致性能更差

Kotlin 函数式编程

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

函数是一等公民

  • 函数可以独立于类之外 --- 顶层函数
  • 函数内部可以嵌套函数 --- 闭包
  • 函数可以作为参数和返回值 --- 高阶函数
  • 函数可以像变量一样引用 --- 函数类型的对象

纯函数

在函数式编程当中,要求函数必须是 纯函数,我们不应该修改任何非函数作用域内的变量;当确实需要修改时,应该创建一份新的拷贝再修改。

  • 无副作用的函数具有幂等性 --- 调用 N 次的效果等价
  • 无副作用的函数具有引用透明特性 --- 不会对引用做任何修改
  • 无副作用的函数具有无状态特性 --- 不会存储任何状态

局限性

  • Kotlin 并没有完全拥抱函数式编程,它只是在一些语法设计上,借鉴了函数式编程的思想,而且这种借鉴的行为也十分克制,比如模式匹配、类型类、单子
  • 函数式编程领域的很多高级概念,Kotlin 也都没有天然支持,需要我们自己去实现
  • Kotlin 函数式编程目前仍未成为主流

随着 2021 年 Android 推出 Jetpack Compose 声明式 UI 框架,以及 Kotlin 官方推出的 Compose Multiplatform,将来,Kotlin 函数式编程会被更多的人认可和接受。

实战:函数式的循环

使用递归实现循环

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

// 目标,计算前 number 个自然数的和
// 例如,前 2 个自然数的和为 1+2=3,前 3 个自然数的和为 1+2+3=6
fun qtSum(number: Int): Int {
    fun sum(i: Int, sum: Int): Int = if (i > number) sum else sum(i + 1, sum + i) // 递归
    return sum(1, 0)
}

println((0..5).map { qtSum(it) })  // [0, 1, 3, 6, 10, 15]

尾递归

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

tailrec fun sum(i: Int, sum: Int): Int = TODO() // 加关键字 tailrec 就是尾递归

2017-05-31

posted @ 2017-05-31 13:43  白乾涛  阅读(5480)  评论(0)    收藏  举报