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

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

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

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

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

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

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

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

  8. 例:

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

      val sum = firstInput + secondInput;

      return sum;

    }

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

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

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

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

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

    3. 高阶方法(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类型值.

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

      (x:Int) => {

        x + 100;

      }

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

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

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

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