在非函数式编程语言里,函数的定义包含了“函数类型”和“值”两种层面的内容。但是,在函数式编程中,函数是“头等公民”,可以像任何其他数据类型一样被传递和操作,也就是说,函数的使用方式和其他数据类型的使用方式完全一致了。这时,我们就可以像定义变量那样去定义一个函数,由此导致的结果是,函数也会和其他变量一样,开始有“值”。就像变量的“类型”和“值”是分开的两个概念一样,函数式编程中,函数的“类型”和“值”也成为两个分开的概念,函数的“值”,就是“函数字面量”。 整数字面量
scala> val i = 1
i: Int = 1
浮点数字面量
scala> val f = 3.1415
f: Double = 3.1415
布尔型字面量
scala> val b = true
b: Boolean = tru
字符字面量
scala> val c = 'A'
c: Char = A
字符串字面量
scala> val s ="hello world"
s: String = hello world
不需要给每个函数命名,可以使用匿名函数,匿名函数的定义形式,称为“Lambda表达式”。“Lambda表达式”的形式如下:
(参数) => 表达式 //如果参数只有一个,参数的圆括号可以省略
(num: Int) => num +1
把匿名函数存放到变量中,addFunc是计算2个数的和,下面是在Scala解释器中的执行过程:
scala> val addFunc = (a:Int,b:Int) => a+b
addFunc: (Int, Int) => Int = $$Lambda$1052/1403539444@7ce85af2
scala> println(addFunc(1,2))
3
一个接受其他函数作为参数或者返回一个函数的函数就是高阶函数。
使用下划线作为一个或多个参数的占位符,只要每个参数在函数字面量内仅出现一次。
scala> val list = List(1,2,3,4,5)
list: List[Int] = List(1, 2, 3, 4, 5)
scala> list.filter(x => x>3)
res2: List[Int] = List(4, 5)
scala> list.filter(_ > 3)
res3: List[Int] = List(4, 5)
x => x>3和_ > 3是等价的,当采用下划线的表示方法时,对于列表list中的每个元素,都会依次传入用来替换下划线,首先传入1,然后判断1>3是否成立,如果成立,就把该值放入结果集合,如果不成立,则舍弃,接着再传入2,然后判断2>3是否成立,依此类推。最终符合结构的就是4和5了