变长参数
传递的参数是可以改变的。
例如:
代码语言:javascript复制def sum(nums:Int * ) = {
var result = 0
for(num <- nums){
result = num
}
result
}
result 是返回值
因为是返回值,所以 在定义的时候别忘记有 = 。
如何传递 range 序列 ?
比如上面的传递 val s = sum(1 to 10) 这样子是不对的,此时需要使用 scala 特殊的语法将参数定义为序列,让 scala 解释器能够识别。
形如这样子:
代码语言:javascript复制val s = sum(1 to 10: _*)
递归函数实现累加
代码语言:javascript复制def sum(nums: Int*):Int = {
if(nums.length == 0) 0
else nums.head sum(nums.tail: _*)
}
head 是取头部第一个,后面的 nums.tail 相当于截取的子序列。
过程、lazy值和异常
过程:在 scala 中,定义函数时,如果函数体直接包括在花括号里面,而没有使用 = 连接,则函数的返回值类型就是 Unit 。这种的函数被称为过程。
过程通常用于不需要返回值的函数。
将函数的返回值类型定义为 Unit 也算是过程。
比如:
代码语言:javascript复制def sayName(name:String){
print("Hi," name);
"Hi " name
}
或者
代码语言:javascript复制def sayName(name:String):Unit = "Hi," name
lazy 值:如果将一个变量声明为 lazy ,则只有在第一次使用该变量时,变量对应的表达式才会发生计算。
这种特性对于特别耗时的计算操作特别有用,比如打开文件进行读写,后者进行网络 IO 。
定义的时候不会被进行计算,有点像操作系统中假分配,只有使用的时候才会去进行计算,将结果返回。
即使定义的 lazy 值计算会出错,但是只是定义的话不会出错,使用的才会去验证会不会出错。
减少不必要的加载,真正使用的时候再调用。
异常:异常的处理和捕获机制与 Java 相似。
代码语言:javascript复制try{
}catch{
}finally{
}
例子:
代码语言:javascript复制import java.io._
try {
throw new IOException("user defined exception")
}catch{
case e1:IllegalArgumentException => println("illegal argument")
case e2: IOException => println("io Exception")
}
数组操作的 Array、ArrayBuffer 以及遍历
Array
在 scala 中的 Array 代表的含义与 Java 中类似,也是长度不可改变的数组。由于 Scala 与 Java 都是运行在 JVM 中,双方可以互相调用,因此 Scala 数组的底层实际上是 Java 数组。 比如字符串数组在底层就是 Java 的 String[] ,整数数组在底层就是 Java 的 Int[] 。
数组初始化后,长度就固定下来,元素全部根据类型初始化。
代码语言:javascript复制val a = new Array[Int](10)
[ ] 里面是泛型参数,指定类型。
默认是 0 。
创建 String 类型的默认是 null 。
直接用 Array() 创建数组,元素类型自动推断。
代码语言:javascript复制val a = Array("hello","word")
ArrayBuffer
如果不预先导入包,那么需要使用全限定名。
如果直接使用 ArrayBuffer ,则预先导入 ArrayBuffer 类。
代码语言:javascript复制import scala.collection.mutable.ArrayBuffer
val b = ArrayBuffer[Int]()
b = 1
b = (2,3,4)
使用 = 操作符,可以添加一个元素或者多个元素。
使用 = 操作符,可以添加其他集合中的所有元素。
使用 trimEnd() 函数,可以从尾部截断指定个数的元素。
使用 insert() 函数可以在指定位置插入元素。
【需要移动指定位置后的所有元素,效率较低】
代码语言:javascript复制b.insert(1,2)
b.insert(1,6,7,8)
b.insert(1,2) 表示在 index = 1 的位置插入元素 2。
b.insert(1,6,7,8) 表示在 index = 1的位置插入元素 6, 7, 8 。
使用 remove() 函数可以移出指定位置的元素。
代码语言:javascript复制b.remove(1)
b.remove(1,3)
这里和 insert 一样理解。
Array 和 ArrayBuffer 可以互相转换。
代码语言:javascript复制b.toArray
b.toBuffer
遍历 Array 和 ArrayBuffer
使用 for 循环和 until 遍历
代码语言:javascript复制for(i <- 0 until b.length) print(b(i))
// 跳跃遍历,更改步长
for(i <- 0 until (b.length,2))print(b(i))
// 反向遍历,从尾开始
for(i <- (0 until b.length).reverse)println(b(i))
//使用增强 for 循环
for(e <- b) println(e)