Scala函数式编程思想

版权声明:个人博客网址 https://29dch.github.io/ 博主GitHub网址 https://github.com/29DCH,欢迎大家前来交流探讨和fork! https://blog.csdn.net/CowBoySoBusy/article/details/83050965

Scala是纯面向对象语言,而函数式编程是它的核心也是它最大的优势点
一些重要概念:
1.纯函数(Pure Function),或函数的纯粹性(Purity),即没有副作用(Side Effect)
副作用是状态的变化
例子:
在这里插入图片描述
可见第二个函数对x有副作用,所以第一个函数为纯函数

2.引用透明性
对于相同的输入,总是得到相同的输出
如果f(x)的参数x和函数体都是引用透明的,那么函数f是纯函数
append()方法违反了引用透明性,对于相同的输入(" World!"),每次返回不同的值.
在这里插入图片描述
不变性:为了获得引用透明性,任何值都不能变化
3.函数是第一等公民,一切都是计算,函数式编程中只有表达式,变量、函数都是表达式
高阶函数:函数可以成为另一个函数的输入和输出
闭包
4.表达式求值策略
严格求值和非严格求值以及惰性求值
Call By Value —对函数实参求值,且仅求值一次
Call By Name —函数实参每次在函数体内被调用到时都会求值
在这里插入图片描述
惰性求值:lazy,第一次不求值,以后每次求值
5.递归函数
递归实现循环,尾递归调优
在这里插入图片描述
在这里插入图片描述
以上代码不同于传统的阶乘递归代码,在栈区只为m变量分配了内存地址,只存储最新的阶乘值,而不是像传统的一样开很多堆栈区内存来存储各个阶段的阶乘值.这样就有效避免了因为参数值过大,导致递归次数过多从而产生的一系列堆栈溢出问题!
注意一定要在函数定义顶部加**@annotation.tailrec**,否则Scala编译器不会识别,从而不会进行尾递归调优.

函数式编程的优点:
生产效率高,代码简洁高效
对于相同的输入,总是得到相同的输出,这样就便于推理
适用于并行编程,多核计算,云计算(Spark分布式计算框架内层就是由Scala编写)

在现今以及未来多核计算、云计算时代下,Scala这类函数式编程语言必将得到长久重视和稳步发展!

猜你喜欢

转载自blog.csdn.net/CowBoySoBusy/article/details/83050965