函数示例
函数的定义使用def关键字,并且函数体最后有返回值。
//声明了一个函数f3,两个参数:param1是String类型,param2为Int类型。param2默认值为30,因为有了默认值,那么在调用上可以不传param2。
scala>deff3(param1:String, param2:Int=30) = param1 + param2
f3: (param1: String, param2: Int)String
//调用函数f3,传入第一个参数param1值为Spark,没有传入第二个参数,默认为30。
scala> f3("Spark")
res4: String = Spark30
//带名参数调用,即在函数调用时,显示指定参数名,并不按顺序传入。
scala> f3(param2=100, param1="Scala")
res5: String = Scala100
//变长参数, 定义了一个sum函数,参数numbers是变成参数,即传入的Int变量个数不定。在函数体中,对传入的全部Int变量进行循环遍历并累计求和,最后把结果返回。
scala> def sum(numbers:Int*)={var result=0; for(element<-numbers) result +=element; result}
sum: (numbers: Int*)Int
scala> sum(1,2,3,4,5,6,7,8,9,10)
res1: Int = 55
//下面示例是一个非常经典的语法
scala> sum(1 to 10: _*)// _* 表示提取里面的每个元素, 然后作为变长参数传递
res3: Int = 55
过程
没有返回值的函数就是过程。
//这是一个函数
scala> def morning(content:String) = "Good" + content
morning: (content: String)String
//这是一个过程
scala> def morning(content:String) { println( "Good" + content)}
morning: (content: String)Unit
//强制声明一个过程
scala> def morning(content:String):Unit= "Good" + content
morning: (content: String)Unit
声明lazy类型
scala> import scala.io.Source._//导入引用库
import scala.io.Source._
//声明一个lazy类型的变量content,打开一个不存在的文件。
scala> lazy val content = fromFile("/root/txt")
content: scala.io.BufferedSource =
以上示例执行不会出错,表明content变量并没有执行。
//如果去掉lazy关键字,那么会出错,提示文件不存在。
scala> val content = fromFile("/root/txt")
java.io.FileNotFoundException: /root/txt (No such file or directory)
at java.io.FileInputStream.open0(Native Method)
at java.io.FileInputStream.open(FileInputStream.java:195)
at java.io.FileInputStream.(FileInputStream.java:138)
耗时的操作,在大型分布式系统中,比较常见。声明lazy类型的变量,在需要的时候才去执行。
异常
//首先导入相关引用包
scala> import java.io._
import java.io._
scala>
//示例打开一个存在的文件,使用try…catch捕获异常
scala> try{
| val content = fromFile("/root/.bashrc").mkString
| }catch{
| //case是一个偏函数
| case _: FileNotFoundException => println("Oh, file not found!")
| }finally{
| println("Ok!")
| }
Ok!
scala>
//示例打开一个不存在的文件,使用try…catch捕获异常
scala> try{
| val content = fromFile("/root/.bashrc111").mkString
| }catch{
| //case是一个偏函数
| case _: FileNotFoundException => println("Oh, file not found!")
| }finally{
| println("Ok!")
| }
Oh, file not found!