1 函数式编程思想
- 纯函数,没有副作用
即没有诸如修改全局变量、抛出异常、IO读写和调用有副作用的函数等状态变化 - 参数和函数体都是引用透明
即对于相同的输入,总是得到相同的输出。反例:append函数。
为了获得引用透明性,任何值都不能变化。 - 函数是一等公民
Scala中函数就像普通变量一样,同样也具有函数的类型。
- 高阶函数:用函数作为形参或返回值的函数
- 闭包
2 语言基础
2.1 变量
val、 var、 lazy val
注:当定义的变量可能后续不会用到时可使用lazy val
2.2 数据类型
- Unit:表示空,
val x:Unit=()
,val x=()
- Null:scala中通常不会使用null而是使用option
- Nothing:表示程序异常中止,若一个函数返回nothing表明该函数发生异常
- String:支持字符串插值,用${name}可在字符串里引入name这个变量代表的字符串
2.3 函数与代码块
2.3.1 代码块
代码块Block是表达式,最终的值是最后一个表达式的值,Block有两种表达方式:
- {exp1;exp2}
- {
exp1
exp2
}
2.3.2 函数
- 只有一个表达式的时候可以去掉花括号
- 有些简单的表达式scala会自动推断出返回类型
2.4 if与for
2.4.1 if
if (lofical_exp) valA
if (lofical_exp) valA else valB
·
2.4.2 for
是实现循环的推导式,本质是scala的函数向Map、Reduce组合而实现的,是scala的语法糖的一种。
2.5 try与match表达式
2.5.1 try
try是表达式,会返回一个值
2.5.2 match
类似c++的switch
3 求值策略
scala中所有运算都是基于表达式。默认是call by value,函数调用前会对实参中所有的表达式进行求值。
举个栗子:
4 高阶函数
4.1 函数与匿名函数
- 函数类型:A=>B,表示一个接受类型A的参数,并返回类型B的函数
- 高阶函数:用函数作为形参或返回值的函数
- 匿名函数:函数常量,格式为:{形参列表}=>{函数体}
例:(x:Int, y:Int) => x + y
4.2 柯里化
把具有多个参数的函数转换为一条函数链,每个节点是单一参数
4.3 递归与尾递归
在函数式编程中,所有的循环都是通过递归实现。
递归层数多,容易造成堆栈溢出。为了解决这个问题,于是出现了尾递归。
举个栗子:
5 Collections-list基本使用
5.1 List[T]
val a=List(1,2,3,4)
val b=0::a
val c="x"::"y"::Nil
val d=a:::c
a.head //返回当前List的第一个元素
a.tail //返回当前List除了第一个元素外剩下元素组成的列表
a.isEmpty
Nil,Empty
List的高阶函数
- 参数都是匿名函数
- takeWhile遍历到False时就停止了
- 区分map与flatMap
6 集合的归约操作
6.1 reduceLeft
6.2 foldLeft 更通用
6.3 Rang与Stream
6.4 tuple与map
举个栗子:实现快速排序,每次取元素为a.head,把小于a.head放在前面,大于的放在后面。