Scala 【 4 参数、过程以及数组 Array 和 ArrayBuffer 】

2023-03-09 14:42:57 浏览数 (2)

变长参数

传递的参数是可以改变的。

例如:

代码语言: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)

0 人点赞