在Scala中,可以直接将某个函数作为参数传入其他的函数。带函数参数的函数由于是一个接受函数参数的函数,故被称为高阶函数(High-Order function)。
/**
* Scala高阶函数示例
*/
objectHighOrderFunction {
/*
* greeting就是高阶函数
* name:String类型的一个正常参数
* func:函数类型的一个参数,定义一个接受String类型的,返回值类型为Unit的函数这样的一个参数函数
* */
defgreeting(name: String, func: (String) => Unit) = {
func(name)
}
defsayHiFunc(name: String) = {
println(s"Hi,${name}")
}
defmain(args: Array[String]): Unit = {
defsayHelloFunc(name: String) = {
println(s"Hello,${name}")
}
//把函数赋值给变量
valsayHello = sayHelloFunc _
greeting("xiaoming", sayHello)
//=======================================================
greeting("zhangsan", sayHiFunc _)
//由于greeting函数定义的时候要求第二个参数必须是函数类型,所以这里可以直接写函数名称,
//表示其实就是传递了一个函数,可以不加下划线
greeting("zhangsan", sayHiFunc)
//=======================================================
//匿名函数一般和高阶函数是一起使用的,匿名函数作为高阶函数的输入参数
greeting("xiaoming", (abc: String) => {
println(s"nihao,${abc}")
})
//高阶函数的简化
//可以将输入参数的数据类型省略,原因:scala的编译器会自动的根据上下文的内容就行推断
//自动推断数据类型
greeting("zhangsan", (abc) => { println(s"nihao,${abc}") })
//如果只有一个输入参数,可以考虑省略小括号
greeting("zhangsan", abc => { println(s"nihao,${abc}") })
//如果左侧的所有的输入参数在右侧的函数体中有且仅有一次而且使用的顺序和输入参数的列表中的顺序是一致的
//可以考虑省略输入参数,并使用_代替,实际开发中不建议使用,阅读起来很费劲
greeting("zhangsan", println(_)) //===============================================================================================
defopera(a: Int, b: Int, func: (Int, Int)=> Int) = {
println(s"result=${func(a, b)}")
}
valvalue1: Int = 9;
valvalue2: Int = 2;
println(s"求和:${value1} + ${value2}")
opera(value1, value2, (x: Int, y: Int) => x+y)
opera(value1, value2, (x, y) => x+y)
//第一个下划线表示第一输入参数,第二个下划线表示第二个输入参数
opera(value1, value2, _ + _)
println(s"差值:${value1} - ${value2}")
opera(value1, value2, (x: Int, y: Int) => x-y)
opera(value1, value2, (x, y) => x-y)
//第一个下划线表示第一输入参数,第二个下划线表示第二个输入参数
opera(value1, value2, _ - _)
println(s"乘积:${value1} * ${value2}")
opera(value1, value2, (x: Int, y: Int) => x*y)
opera(value1, value2, (x, y) => x*y)
//第一个下划线表示第一输入参数,第二个下划线表示第二个输入参数
opera(value1, value2, _ * _)
println(s"取模:${value1} / ${value2}")
opera(value1, value2, (x: Int, y: Int) => x/y)
opera(value1, value2, (x, y) => x/y)
//第一个下划线表示第一输入参数,第二个下划线表示第二个输入参数
opera(value1, value2, _ / _)
}
}
运行结果:
Hello,xiaoming
Hi,zhangsan
Hi,zhangsan
nihao,xiaoming
nihao,zhangsan
nihao,zhangsan
zhangsan
求和:9 + 2
result=11
result=11
result=11
求差:9 - 2
result=7
result=7
result=7
求积:9 * 2
result=18
result=18
result=18
求模:9 / 2
result=4
result=4
result=4