Scala高阶函数

  • 在scala中的函数是“头等公民”,就和数字一样。
  • 你可以创建匿名函数,通常还会把他们交给其他函数。
  • 函数参数可以给出需要稍后执行的行为。
  • 许多集合方法都接受函数参数,将函数应用到集合中的值。

值函数

import scala.math._
val num = 3.14
val fun = ceil _
Array(3.14,1.42,2.0).map(fun)

匿名函数

你不需要为每一个函数命名,就像你不需要为每个数字命名一样。

Array(3.14,1.42,2.0).map((x : Double) => 3 * x)

带函数参数的函数

def valueAtOneQuarter(f : (Double) => Double) = f(0.25)
//这里的参数可以是任何接受Double并返回Double的函数。valueAtOneQuarter将计算那个函数在0.25位置的值。
valueAtOneQuarter(ceil _)//1.0
valueAtOneQuarter(sqrt _)//0.5
//valueAtOneQuarter的类型是((Double) => Double) => Double

valueAtOneQuarter是一个接收函数参数的函数,因此叫做高阶函数。 高阶函数也可以产出另一个函数。

def mulBy(factor : Double) = (x : Double) => factor * x
val quintuple = mulBy(5)
quintuple(10)
//mulBy的类型是:Double => ((Double) => Double)

mulBy的威力在于,它可以产出能够乘以任何数额的函数。

常用的高阶函数

(1 to 9).map("*" * _).foreach(println _)
//foreach跟map很像,不过它的函数并不返回任何值。
(1 to 9).filter(_ % 2 == 0)
(1 to 9).reduceLeft(_ * _)
"Mary has a little lamb".split(" ").sortWith(_.length < _.length)

闭包

def mulBy(factor : Double) = (x : Double) => factor * x
val triple = mulBy(3)
val half = mulBy(0.5)

每一个返回的函数都有自己的factor设置。 这样一个函数被称作闭包,闭包由代码和代码用到的任何非局部变量定义构成。 这些函数实际上是以类的对象方式实现的,该类有一个实例变量factor和一个包含了函数体的apply方法。scala编译器会保证你的函数可以访问非局部变量。 JavaScript,Ruby,Python都支持闭包。

currying

柯里化(美国逻辑学家Haskell Brooks Curry的名字命名)指的是将原来接受两个参数的函数变成新的接受一个参数的过程。新的函数返回一个以原有第二个参数作为参数的函数。

def mulOneAtTime(x : Int)=(y : Int) => x * y
val a = mulOneAtTime(5)//柯里话
val b = a(4)

return表达式

return语句可以从匿名函数中返回值给包含这个匿名函数的带名函数。

def Indexof(str : String , ch : Char) : Int = {
var i = 0
until(i == str.length){
    if(str(i)==ch) return i
    i += 1
}
return -1
}

如果你要在带名函数中使用return,需要给出返回类型,因为编译器无法推断出它的类型。

Comments !