Appearance
在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文件不存在,代码也不会报错,只有变量使用时才会报错。