文章地址:http://www.haha174.top/article/details/253186
1.定义函数
在scala 中定义函数时,如果函数体直接包裹在了花括号里面,而没有使用=连接,则函数的返回值类型就是Unit , 这样的函数就被成为过程,过程通常时不需要返回值的函数,还有一种写法,就是将函数的返回值类型定义成为Unit 。
在scala中定义函数的时候,需要定义函数的函数名,参数,函数体。scala
要求必须给出所有参数的类型,但不一定给出函数的返回值类型,只有右侧的函数体中不包含递归的语句,scala就可以根据自己的右侧表达式推断出返回类型。
下面给出一个示例
def hello(name:String,age:Int): Unit ={
println("name"+name+"age:"+age)
}
2.在代码块中定义函数体
如果函数体中有多行代码,则可以使用代码块的方式包裹多行代码,代码块的最后一行的返回值是整个函数的返回值。于java 不同的是,不适用returan 的返回值。
3.递归
下面给出一个经典的斐波那契数列示例:
def fab(n:Int): Int ={
if(n<=1) 1
else fab(n-1)+fab(n-2)
}
4.默认参数和带名参数
默认参数
在scala 中有时我们希望调用某些函数时,不希望给出参数的具体值,而希望使用参数自身的默认值,此时就定义在定义函数时使用默认参数。
如果给出的参数不够,会从左往右依次应用参数。
下面给出一个示例:
def hello(firstName:String,middleName:String=" middleName",lastName:String=" lastName"): Unit ={
printf(firstName+middleName+lastName)
}
带名参数
在调用函数也可以不按照函数的定义参数的循序来传递参数,而使用带名参数的方式来传递,还可以混合使用未命名参数和带名参数但是未命名的参数必须排在命名的参数前面
如:
def hello(firstName:String,middleName:String=" middleName",lastName:String=" lastName"): Unit ={
printf(firstName+middleName+lastName)
}
hello(lastName = "last",firstName = "first",middleName = "middle")
或者
hello("first",lastName = "last",middleName = "middle")
5.边长参数
在scala 中有时侯需要将函数定义的参数个数可变的形式,此时可以使用边长参数定义函数。
下面给出一个简单示例
def sum(nums:Int*): Int ={
var res=0
for(num<-nums)res+=num
res
}
调用的时候只需要这样即可
sum(1,2,3,4,5)
如果想要将一个已有的序列直接调用边长函数,是不对的。比如val s=sum(1 to 5)
此时需要使用scala 的特殊语法将参数定义为序列,让Scala 解释器能够识别
下面给出一个案例使用递归实现累加。
def sum2(nums:Int*): Int ={
if(nums.length==0) 0
else nums.head+sum2(nums.tail:_*)
}
6.lazy 值和异常
lazy
在Scala中提供lazy 特性,也就是说,如果将一个变量声明成为lazy,则只有在第一次使用该变量的时候,变量对应的表达式才会计算,这种特性对于特别耗时的计算非常有用,如打开文件的io 和网络io 等等。
下面给出一个示例:
def lazyDemo(): Unit ={
lazy val a=1/0;
println("before lazy")
println(a)
}
发现打印的结果为
before lazy
Exception in thread "main" java.lang.ArithmeticException: / by zero
at com.wen.scala.ClassDefine$.a$lzycompute$1(ClassDefine.scala:36)
at com.wen.scala.ClassDefine$.a$1(ClassDefine.scala:36)
at com.wen.scala.ClassDefine$.lazyDemo(ClassDefine.scala:38)
at com.wen.scala.ClassDefine$.main(ClassDefine.scala:14)
at com.wen.scala.ClassDefine.main(ClassDefine.scala)
异常
在scala 中异常和java 很相似
try {
throw new IOException("not found");
}catch {
case e1:IOException=>println("ioException")
}finally {
println("finally")
}