Kotlin 朱涛 思维-1 函数式思维 命令式 声明式
目录
Kotlin 函数式编程
编程范式
函数式编程
是一个跟面向对象编程
类似的概念,它也是软件工程中的一种编程范式
,它是声明式编程
的一种,与它相反的叫做命令式编程
。
- 声明式编程 Declarative Programming
- 函数式编程 Functional Programming
- 命令式编程 Imperative Programming
- 面向对象编程 Object Oriented Programming
- 面向过程编程 Process Oriented Programming
两种编程范式的区别
- 命令式编程:在编程的时候,告诉计算机每一步
具体都要干什么
,每一步的细节都需要我们去实现 - 声明式编程:在编程的时候,只需声明我们
想要什么
,而不关心具体的实现细节- 可以使用标准库中的方法实现,也可以自己定义一个方法实现
声明式编程的优缺点
- 优点:
- 开发效率高,代码更简洁,可读性更强
- 具有不变性、无状态等特点,更适合
并发编程
- 缺点:
- 学习曲线十分陡峭、反直觉
- 由于自身特性的限制,往往会导致
性能更差
Kotlin 函数式编程
Kotlin 融合了很多现代化语言的特性,它在支持命令式编程
的同时,也对函数式编程
有着天然的亲和力。
函数是一等公民
- 函数可以独立于类之外 -- 顶层函数
- 函数内部可以嵌套函数 -- 闭包
- 函数可以作为参数和返回值 -- 高阶函数和 Lambda
- 函数可以像变量一样引用
必须是纯函数
- 函数不能有副作用:不能对函数作用域以外的数据进行修改
- 无副作用的函数具有
幂等性
-- 调用 1 次和 N 次的效果等价 - 无副作用的函数具有
引用透明
特性 -- 不会对引用做任何修改 - 无副作用的函数具有
无状态
特性 -- 不会存储任何状态
在函数式编程当中,我们不应该修改任何非函数作用域内
的变量;当确实需要修改时,应该创建一份新的拷贝再修改。
局限性
- Kotlin 并没有完全拥抱函数式编程,它只是在一些语法设计上,借鉴了函数式编程的思想,而且这种借鉴的行为也十分克制,比如模式匹配、类型类、单子
- 函数式编程领域的很多高级概念,Kotlin 也都没有天然支持,需要我们自己去实现
- Kotlin 函数式编程目前仍未成为主流
随着 2021 年 Android 推出 Jetpack Compose
声明式 UI 框架,以及 Kotlin 官方推出的 Compose Multiplatform
,将来,Kotlin 函数式编程会被更多的人认可和接受。
实战:函数式的循环
使用递归实现循环
如果不使用 for 循环,仅仅只使用函数,该如何实现循环
功能呢?答案是:使用 递归。
fun qtSum(max: Int): Int {
fun sum(i: Int, sum: Int): Int =
if (i > max) sum
else sum(i + 1, sum + i) // 递归
return sum(1, 0)
}
(-1..3).map { qtSum(it) }.joinToString().also { println(it) } // 0, 0, 1, 3, 6
PA:在实际的开发工作中,这种方式并不推荐,如果有类似的需求,可以使用 Kotlin 的集合操作符。
尾递归
递归都是有调用栈
开销的,所以我们应该尽量使用尾递归
。尾递归在经过栈复用优化以后,它的开销就可以忽略不计了,空间复杂度可以认为是 O(1)
。
tailrec fun sum(i: Int, sum: Int): Int = {} // 加关键字 tailrec 就是尾递归
2017-05-31
本文来自博客园,作者:白乾涛,转载请注明原文链接:https://www.cnblogs.com/baiqiantao/p/6923751.html