Sacla语言支持:
(1)把函数作为实参传递给另一个函数
(2)把函数作为返回值
(3)把函数赋值给变量
(4)把函数存储在数据结构里
在Scala中,函数就像普通变量一样,同样也具有函数的类型。函数类型的格式为:A => B,表示一个接受类型A的参数,并返回类型B的函数。
高阶函数:用函数作为形参或返回值的函数
例子:
def operate(f:(Int,Int)=> Int ){
f(4,4)
}
def greeting() = (name : String)=> { "hello" +" " + name }
匿名函数(Anonymous Function)就是函数常量,也成为函数文字量
格式:(形参列表)=> {函数体}
柯里化函数(Curried Function)把具有多个参数的函数转换为一条函数链,每个节点上是单一函数.
说明(下面两个函数等价):
def add(x:Int ,y:Int) = x + y
def add(x:Int)(y:Int) = x + y
例子(对每个整型进行+1操作):
def curriedAdd(a:Int)(b:Int) = a + b
val addOne = curriedAdd(1)_ //柯里化构造新函数
addOne(2)
递归函数(Recursice Function)在函数式编程中是实现循环的一种技术
例子:计算n!
def factorial(n:Int):Int =
if(n <= 0)1
else n * factorial(n - 1)
尾递归
尾递归函数(Tail Recursive Function)中所有递归形式的调用都出现在函数的末尾。
当编译器检测到一个函数调用是尾递归的时候,它就覆盖当前的活动记录而不是在栈中去创建一个新的。
例子:计算n!
@annotation.tailrec //不加这个,不进行尾递归优化
def factorial(n:Int,m:Int):Int =
if(n <= 0)m
else fuctorial(n - 1,m * n)
factorial(5,1)
例子:计算Σ(a,b)f(x)
object sumfunc {
def sum(f:Int => Int)(a:Int)(b:Int):Int = {
@annotation.tailrec
def loop(n:Int,acc:Int):Int = {
if(n>b){
println(s"n=${n},acc=${acc}")
acc
}else{
println(s"n=${n},acc=${acc}")
loop(n+1,acc+f(n))
}
}
loop(a,0)
}
def main(args: Array[String]): Unit = {
sum(x=>x)(1)(5) //(1)
sum(x=>x*x)(1)(5) //(2)
}
}
运行结果:
(1)n=1,acc=0
n=2,acc=1
n=3,acc=3
n=4,acc=6
n=5,acc=10
n=6,acc=15
(2)n=1,acc=0
n=2,acc=1
n=3,acc=5
n=4,acc=14
n=5,acc=30
n=6,acc=55
柯里化优化:
val sumSquare = sum(x => x * x)_
sumSquare (1)(5)
执行结果与(2)结果相同
顶层父类:Traversable 遍历
直接子类:Iterable 迭代
三类集合:Set 、Seq(一组元素,有顺序的,顺序有意义)、Map
(1)定义:
scala> val a = List(1,2,3,4)
a: List[Int] = List(1, 2, 3, 4)
(2)拼接获取List
scala> val b = 0 :: a
b: List[Int] = List(0, 1, 2, 3, 4)
(3)多重拼接
scala> val c = "x"::"y"::"z"::Nil
c: List[String] = List(x, y, z) //整体运算过程从右至左(从List开始)
(4)双列表拼接
scala> a ::: c
res0: List[Any] = List(1, 2, 3, 4, x, y, z)
(5)访问第一个元素
scala> c.head
res1: String = x
(6)访问除第一个元素外的元素
scala> a.tail
res2: List[Int] = List(2, 3, 4)
(7)判断List是否为空
scala> a.isEmpty
res6: Boolean = false
scala> Nil.isEmpty
res7: Boolean = true
(8)List遍历
scala> def wailthru(l:List[Int]):String = {
| if(l.isEmpty)""
| else l.head.toString + "" + wailthru(l.tail)
| }
wailthru: (l: List[Int])String
scala> var a = List(1,2,3)
a: List[String] = List(1, 2, 3)
scala>wailthru(a)
String = "1 2 3 "