📅  最后修改于: 2021-01-09 11:40:28             🧑  作者: Mango
高阶函数是一个函数,要么接受一个函数作为参数或者返回的函数。换句话说,我们可以说这与函数工作的函数称为高阶函数。
高阶函数允许您创建函数组成,lambda函数或匿名函数等。
让我们来看一个例子。
object MainObject {
def main(args: Array[String]) = {
functionExample(25, multiplyBy2) // Passing a function as parameter
}
def functionExample(a:Int, f:Int=>AnyVal):Unit = {
println(f(a)) // Calling that function
}
def multiplyBy2(a:Int):Int = {
a*2
}
}
输出:
60
在scala中,功能可以由其他功能组成。这是一个组合过程,其中一个函数代表两个组合函数的应用。
让我们来看一个例子。
object MainObject {
def main(args: Array[String]) = {
var result = multiplyBy2(add2(10)) // Function composition
println(result)
}
def add2(a:Int):Int = {
a+2
}
def multiplyBy2(a:Int):Int = {
a*2
}
}
输出:
24
匿名函数是没有名称的函数,但可以作为函数。当您不想在以后重用匿名函数时,最好创建一个匿名函数。
您可以通过在Scala中使用=>(火箭)或_(下划线)通配符来创建匿名函数。
让我们来看一个例子。
object MainObject {
def main(args: Array[String]) = {
var result1 = (a:Int, b:Int) => a+b // Anonymous function by using => (rocket)
var result2 = (_:Int)+(_:Int) // Anonymous function by using _ (underscore) wild card
println(result1(10,10))
println(result2(10,10))
}
}
输出:
20
20
用多行编写的表达式称为多行表达式。在scala中,使用多行表达式时要小心。
以下程序说明了如果我们将表达式分成多行,则scala编译器将发出警告消息。
def add1(a:Int, b:Int) = {
a
+b
}
上面的程序不评估完整的表达式,只是在这里返回b。因此,使用多行表达式时要小心。
输出:
MainObject.scala:3: warning: a pure expression does nothing in statement
position; you may be omitting necessary parentheses
a
^
one warning found
10
您可以采用以下方法来避免上述问题。
object MainObject {
def add2(a:Int, b:Int) = {
a+
b
}
def add3(a:Int, b:Int) = {
(a
+b)
}
def main(args: Array[String]) = {
var result2 = add2(10,10)
var result3 = add3(10,10)
println(result2+"\n"+result3)
}
}
输出:
20
20
在scala中,方法可能具有多个参数列表。当一个方法被调用以较少的参数列表中,那么这将产生一个函数取缺少参数列表作为参数。
换句话说,它是变换函数可以接受多个参数到采用单个参数的函数的技术。
object MainObject {
def add(a:Int)(b:Int) = {
a+b
}
def main(args: Array[String]) = {
var result = add(10)(10)
println("10 + 10 = "+result)
var addIt = add(10)_
var result2 = addIt(3)
println("10 + 3 = "+result2)
}
}
输出:
20
Scala是一流的函数语言,这意味着它允许您传递函数,返回函数,组合函数,嵌套函数等。下面的示例解释了如何定义和调用嵌套函数。
object MainObject {
def add(a:Int, b:Int, c:Int) = {
def add2(x:Int,y:Int) = {
x+y
}
add2(a,add2(b,c))
}
def main(args: Array[String]) = {
var result = add(10,10,10)
println(result)
}
}
输出:
30
在scala中,您可以定义可变长度参数的函数。它允许您在调用函数时传递任意数量的参数。
让我们来看一个例子。
def add(args: Int*) = {
var sum = 0;
for(a <- args) sum+=a
sum
}
var sum = add(1,2,3,4,5,6,7,8,9);
println(sum);
输出:
45