Scala将函数当作一等公民;一个函数可以像一个变量一个被使用;

函数可以作为输入参数传给另一个函数;

函数可以定义为一个匿名函数字面量,就像字符串字面量;

函数可以被赋给一个变量;

可以在一个函数内定义函数;

函数可以作为另外一个函数的返回值;

在Scala中,使用关键字def定义函数;格式如下:

def 函数名(参数1:数据类型,参数2:数据类型):输出类型 = { 函数体 }

例:

def add(firstInput:Int,secondInput:Int):Int = {

val sum = firstInput + secondInput;

return sum;

}

上例的简洁版本如下(省略了输出类型,scala会自动进行类型推断):

def add(firstInput:Int,secondInput:Int) = firstInput + secondInput

Scala支持不同类型的函数,包括:

方法.一个对象的成员函数称为方法.该方法可以访问所属对象的所有字段;

本地函数.在另一个函数或方法内部定义的函数称为"本地函数";它能访问外部函数的变量和输入参数.本地函数只对它所定义的外部函数可见.

高阶方法(higher-order method).一个将一个函数作为输入参数的方法,称为"higher-order method".类似的,一个high-order function是将另一个函数作为输入的函数.高阶方法和高阶函数帮助减少代码重复.此外,使用它们还可以写出更简洁的代码;

下面是一个简单的高阶函数:

def encode(n:Int,f:(Int)=>Long):Long = {

val x = n * 10;

f(x);

}

这段代码输入两个参数,返回一个Long类型的值.第一个输入参数类型是Int.第二个输入参数类型是一个函数f,此函数f需要一个Int类型输入参数,并返回一个Long类型值.

函数字面量.函数字面量指的是一个未命名或匿名函数.在程序中可以像使用一个字符串变量一样使用它.它还可以作为一个输入参数传递给一个高阶方法或高阶函数.另外,它也可以被赋给一个变量.下面是一个函数字面量的例子:

(x:Int) => {

x + 100;

}

字面量函数的定义是使用一个小括号,里面是输入参数,后跟一个右箭头和一个函数体.

上面代码的一个简写版本是: (x:Int) => x + 100;

之前定义的高阶函数encode可以使用一个函数字面量作为输入参数,如下所示:

val code = encode(10,(x:Int) => x + 100);