1.方法定义和调用

object HelloWord {
  def main(args: Array[String]) {
    println("Returned Value : " + addInt(5, 7));  // addInt(5, 7)调用定义的addInt方法
  }

  def addInt(a: Int, b: Int): Int = {    // a: Int 数据类型    : Int类型
    var sum: Int = 0
    sum = a + b
    return sum
  }
}

结果
Returned Value : 12

2.传值调用

先计算参数表达式的值,再应用到函数内部
object HelloWord {
  def main(args: Array[String]) {
    delayed(time());
  }

  def time() = {
    println("获取时间,单位为纳秒")
    System.nanoTime
  }

  def delayed(t: Long) = {
    println("在 delayed 方法内")
    println("参数: " + t)
  }
}

结果
获取时间,单位为纳秒
在 delayed 方法内
参数: 325499987637800

3.传名调用

将未计算的参数表达式直接应用到函数内部

object HelloWord {
  def main(args: Array[String]) {
    delayed(time());
  }

  def time() = {
    println("获取时间,单位为纳秒")
    System.nanoTime
  }

  def delayed(t: => Long) = { // =>设置传名调用
    println("在 delayed 方法内")
    println("参数: " + t)
  }
}

结果
在 delayed 方法内
获取时间,单位为纳秒
参数: 325578016530300

4. 函数 - 可变参数

object HelloWord {
  def main(args: Array[String]) {
    printStrings("Runoob", "Scala", "Python");
  }

  def printStrings(args: String*) = {   // * 设置可变参数(可重复的参数)
    var i: Int = 0;
    for (arg <- args) {
      println(s"Arg value[ + ${i} + ] =  + ${arg}");  // ${} 占位符 自动替换
      i = i + 1;
    }
  }
}

结果
Arg value[0] = Runoob
Arg value[1] = Scala
Arg value[2] = Python

5.闭包

函数内引用函数外的变量

object HelloWord {
  def main(args: Array[String]) {
    println("muliplier(1) value = " + multiplier(1))
    println("muliplier(2) value = " + multiplier(2))
  }

  var factor = 3
  val multiplier = (i: Int) => i * factor
}

结果
muliplier(1) value = 3
muliplier(2) value = 6

6.偏应用函数

偏应用函数是一种表达式,你不需要提供函数需要的所有参数,只需要提供部分,或不提供所需参数。

import java.util.Date
object HelloWord {
  def main(args: Array[String]) {
    val date = new Date
    val logWithDateBound = log(date, _: String)   // log函数需要两个参数, 这样定义就不要每次都带data这个参数

    logWithDateBound("message1")
    Thread.sleep(1000)
    logWithDateBound("message2")
    Thread.sleep(1000)
    logWithDateBound("message3")
  }

  def log(date: Date, message: String) = {
    println(date + "----" + message)
  }
}

结果
Sat Jul 25 15:23:25 CST 2020----message1
Sat Jul 25 15:23:25 CST 2020----message2
Sat Jul 25 15:23:25 CST 2020----message3

7.递归函数

函数可以调用它本身。

object HelloWord {
  def main(args: Array[String]) {
    for (i <- 1 to 10)
      println(i + " 的阶乘为: = " + factorial(i))
  }

  def factorial(n: BigInt): BigInt = {
    if (n <= 1)
      1
    else
      n * factorial(n - 1)
  }
}

结果
1 的阶乘为: = 1
2 的阶乘为: = 2
3 的阶乘为: = 6
4 的阶乘为: = 24
5 的阶乘为: = 120
6 的阶乘为: = 720
7 的阶乘为: = 5040
8 的阶乘为: = 40320
9 的阶乘为: = 362880
10 的阶乘为: = 3628800

8.高阶函数

高阶函数可以使用其他函数作为参数,或者使用函数作为输出结果

object HelloWord {
  def main(args: Array[String]) {
    println(apply(layout, 10))

  }

  // 函数 f 和 值 v 作为参数,而函数 f 又调用了参数 v    f: Int => String 传名调用
  def apply(f: Int => String, v: Int) = f(v)

  def layout[A](x: A) = "[" + x.toString() + "]"
}

结果
[10]

9.匿名函数

object HelloWord {
  def main(args: Array[String]) {
    println("multiplier(1) value = " + multiplier(1))
    println("multiplier(2) value = " + multiplier(2))
  }

  var factor = 3
  val multiplier = (i: Int) => i * factor   // =>左边是参数列表,右边是函数体。
}

结果
multiplier(1) value = 3
multiplier(2) value = 6