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