一、概念
Scala混合了面向对象和函数式的特性,我们通常将可以做为参数传递到方法中的表达式叫做函数。在函数式编程语言中,函数是“头等公民”,高阶函数包含:作为值的函数、匿名函数、闭包、柯里化等等。
二、作为值的函数
可以像任何其他数据类型一样被传递和操作的函数,每当你想要给算法传入具体动作时这个特性就会变得非常有用。
定义函数时格式:
val 变量名 = (输入参数类型和个数) => 函数实现和返回值类型和个数
“=”表示将函数赋给一个变量
“=>”左面表示输入参数名称、类型和个数,右边表示函数的实现和返回值类型和参数个数
三、匿名函数
在Scala中,你不需要给每一个函数命名,没有将函数赋给变量的函数叫做匿名函数
由于Scala可以自动推断出参数的类型,所有可以写的跟精简一些
还记得神奇的下划线吗?这才是终极方式
四、将方法转换成函数
在Scala中,方法和函数是不一样的,最本质的区别是函数可以做为参数传递到方法中
但是方法可以被转换成函数,神奇的下划线又出场了。
五、柯里化
柯里化指的是将原来接受两个参数的方法变成新的接受一个参数的方法的过程
六、例子
/**
* Created by vinsuan on 2017/6/18 0018.
*/
object HighFunc {
val func:(Int,Int) =>Int = {
(x,y) => x+y
}
def mulitply(x:Int):Int = x*x
def m1(x:Int)(y:Int) = x*y
def m2(x:Int)=(y:Int) => x*y
//前面代表没有参数,后面代表有一个参数
def multi() = (x:Int)=>{
x*x
}
def main(args: Array[String]) {
val arr = Array(1,2,3,4,5)
val arr1 = Array((1,2),(2,3))
val re = arr1.map(_._2)
println(re.toBuffer)
}
}
object FunDemo {
def main(args: Array[String]) {
def f2(x: Int) = x * 2
val f3 = (x: Int) => x * 3
val f4: (Int) => Int = { x => x * 4 }
val f4a: (Int) => Int = _ * 4
val f5 = (_: Int) * 5
val list = List(1, 2, 3, 4, 5)
var new_list: List[Int] = null
//第一种:最直观的方式 (Int) => Int
//new_list = list.map((x: Int) => x * 3)
//第二种:由于map方法知道你会传入一个类型为(Int) => Int的函数,你可以简写
//new_list = list.map((x) => x * 3)
//第三种:对于只有一个参数的函数,你可以省去参数外围的()
//new_list = list.map(x => x * 3)
//第四种:(终极方式)如果参数在=>右侧只出现一次,可以使用_
new_list = list.map(_ * 3)
new_list.foreach(println(_))
var a = Array(1,2,3)
a.map(_* 3)
}
}