小记--------scala的函数定义及使用
1.定义函数:需要定义函数的函数名、参数、函数体
函数语法: def 函数名(参数名:参数类型 , 参数名:参数类型) = {函数体}
![小记--------scala的函数定义及使用 小记--------scala的函数定义及使用](/default/index/img?u=ZmlsZTovLy9DOi9Vc2Vycy9FRFovQXBwRGF0YS9Mb2NhbC9UZW1wL2VuaHRtbGNsaXAvSW1hZ2UoMjgpLnBuZw==)
scala要求必须给出所有参数的类型,但是不一定给出函数返回值的类型,只要右侧的函数体中不包含递归的语句,scala就可以自己根据右侧的表达式推断出返回类型。
2.单行的函数:
![小记--------scala的函数定义及使用 小记--------scala的函数定义及使用](/default/index/img?u=ZmlsZTovLy9DOi9Vc2Vycy9FRFovQXBwRGF0YS9Mb2NhbC9UZW1wL2VuaHRtbGNsaXAvSW1hZ2UoMjkpLnBuZw==)
如果函数体中有多行代码,则可以使用代码块的方式包裹多行代码,代码块中最后一行的返回值就是整个函数的返回值,与java不同,不需要使用return返回值。
代码块 : 也就是通过{} 括起来。
例: 定义一个函数累加值
![小记--------scala的函数定义及使用 小记--------scala的函数定义及使用](/default/index/img?u=ZmlsZTovLy9DOi9Vc2Vycy9FRFovQXBwRGF0YS9Mb2NhbC9UZW1wL2VuaHRtbGNsaXAvSW1hZ2UoMzApLnBuZw==)
3.递归函数:必须有函数的返回值类型
例:经典的斐波那契数列 时间复杂度不够好
![小记--------scala的函数定义及使用 小记--------scala的函数定义及使用](/default/index/img?u=ZmlsZTovLy9DOi9Vc2Vycy9FRFovQXBwRGF0YS9Mb2NhbC9UZW1wL2VuaHRtbGNsaXAvSW1hZ2UoMzEpLnBuZw==)
4.函数的默认参数
在scala中,有时我们调用某些函数时,不希望给出参数的具体值,而希望使用参数自身默认的值,此时就定义在定义函数时使用默认参数
![小记--------scala的函数定义及使用 小记--------scala的函数定义及使用](/default/index/img?u=ZmlsZTovLy9DOi9Vc2Vycy9FRFovQXBwRGF0YS9Mb2NhbC9UZW1wL2VuaHRtbGNsaXAvSW1hZ2UoMzIpLnBuZw==)
默认参数就是在设置参数的时候直接 = 一个默认值。即可
5.带名参数
在调用函数时,也可以不按照函数定义的参数顺序来传递参数,而是使用带名参数的方式来传递
![小记--------scala的函数定义及使用 小记--------scala的函数定义及使用](/default/index/img?u=ZmlsZTovLy9DOi9Vc2Vycy9FRFovQXBwRGF0YS9Mb2NhbC9UZW1wL2VuaHRtbGNsaXAvSW1hZ2UoMzMpLnBuZw==)
6.函数入门之变长参数
在scala中,有时我们需要将函数定义为参数个数可变的形式,则此时可以使用变长参数定义函数。
也就是 在参数类型后面添加符号 * 即可。
![小记--------scala的函数定义及使用 小记--------scala的函数定义及使用](/default/index/img?u=ZmlsZTovLy9DOi9Vc2Vycy9FRFovQXBwRGF0YS9Mb2NhbC9UZW1wL2VuaHRtbGNsaXAvSW1hZ2UoMzQpLnBuZw==)
7.通过序列调用可变参数
![小记--------scala的函数定义及使用 小记--------scala的函数定义及使用](/default/index/img?u=ZmlsZTovLy9DOi9Vc2Vycy9FRFovQXBwRGF0YS9Mb2NhbC9UZW1wL2VuaHRtbGNsaXAvSW1hZ2UoMzUpLnBuZw==)
8.函数之入门之过程、lazy值和异常
8.1过程
在scala中,定义函数时,如果函数体直接包裹在了花括号里面,而没有使用=连接,则函数的返回值类型就是Unit, 这样的函数就被称之为过程,过程通常用于不需要返回值的函数。说白了就是正常的函数如果没有返回值那么就称这个函数为过程。
过程还有一种写法,就是将函数的返回值类型定义为Unit
不是过程的函数
![小记--------scala的函数定义及使用 小记--------scala的函数定义及使用](/default/index/img?u=ZmlsZTovLy9DOi9Vc2Vycy9FRFovQXBwRGF0YS9Mb2NhbC9UZW1wL2VuaHRtbGNsaXAvSW1hZ2UoMzYpLnBuZw==)
是过程的函数
![小记--------scala的函数定义及使用 小记--------scala的函数定义及使用](/default/index/img?u=ZmlsZTovLy9DOi9Vc2Vycy9FRFovQXBwRGF0YS9Mb2NhbC9UZW1wL2VuaHRtbGNsaXAvSW1hZ2UoMzcpLnBuZw==)
8.2 lazy值
在scala中,提供了lazy值的特性, 也就是说,如果将一个变量声明为lazy,则只有在第一次使用该变量时,变量对应的表达式才会发生计算,这种特性对特别耗时的计算操作特别有用, 打开文件进行IO,进行网络IO等
案例:
![小记--------scala的函数定义及使用 小记--------scala的函数定义及使用](/default/index/img?u=ZmlsZTovLy9DOi9Vc2Vycy9FRFovQXBwRGF0YS9Mb2NhbC9UZW1wL2VuaHRtbGNsaXAvSW1hZ2UoMzgpLnBuZw==)
在进行IO的时候需要先导入IO的包
import scala.io.Source._
然后定义lazy常量读文件, 当时lazy的时候, 如果文件不存在,也不会报错, 因为只有在使用变量时才会报错。
8.3异常
在scala中,异常处理和捕获机制与java是非常相似的。
![小记--------scala的函数定义及使用 小记--------scala的函数定义及使用](/default/index/img?u=ZmlsZTovLy9DOi9Vc2Vycy9FRFovQXBwRGF0YS9Mb2NhbC9UZW1wL2VuaHRtbGNsaXAvSW1hZ2UoMzkpLnBuZw==)
跟java大致一样,只是在catch处,
java的语法是 catch(IllegalArgumenExecption e){print("sorry")}
而scala语法是 catch{case e; IllegalArgumenExecption => print("sorry")}
finally还是不论如何都会执行此处。