Skip to content

在Scala中,定义函数需要使用def关键字。函数包括函数名、参数和函数体。Scala要求必须给出函数所有参数的类型,但函数返回值的类型不是必须的,因为Scala可以根据函数体中的表达式推断出返回值类型。

与Java不同,Scala中函数的最后一行代码的返回值就是整个函数的返回值,不需要使用return关键字。下面是一个单行函数和一个多行函数的示例。

scala
// 单行函数 
def sayHello(name: String) = print("Hello, " + name)
sayHello("Scala")

// 多行函数
def sayHello(name: String, age: Int) = {
    println("My name is "+ name +" age is " +age)
    age // 返回age信息
}
sayHello("Scala", 18) // 函数调用

默认参数

在Scala中,函数的变量可以设置默认值,如果给出的参数不够,则会从左往右依次应用参数。

scala
def sayHello(name: String, age: Int = 18) = {
    println("My name is "+ name +" age is " +age)
    age
}

scala> sayHello("zhang") //可以直接传参
My name is zhang age is 18
res4: Int = 18

scala> sayHello(name="tom") // 也可以使用名称传递
My name is tom age is 18
res5: Int = 18

可变参数

scala
def sum(nums: Int*) = {
    var res = 0
    for (num <- nums) res += num
    res
}

scala> sun(18,220,56)
res7: Int = 294

特殊的函数:过程

在Scala中,如果函数体直接在花括号里且没有使用=连接,那么该函数的返回类型为Unit,这样的函数被称为过程,过程通常用于不需要返回值的函数。

  • 前面两种写法的效果是一样的,都是函数
  • 后面两种写法的效果是一样的,都是过程
scala
def sayHello(name: String) = "Hello, " + name
def sayHello(name: String): String = "Hello, " + name
def sayHello(name: String) { "Hello, " + name }
def sayHello(name: String): Unit = "Hello, " + name

lazy

Scala提供了lazy特性,如果将一个变量声明为lazy,则只有在第一次使用该变量时,变量对应的表达式才会发生计算。

这种特性对于特别耗时的操作特别有用,比如打开文件这个操作。

scala
import scala.io.Source._
 lazy val lines = fromFile("D://test.txt").mkString

TIP

即使D://test.txt文件不存在,代码也不会报错,只有变量使用时才会报错。