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

变长参数

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

例如:

def sum(nums:Int * ) = {
	var result = 0
	for(num <- nums){
		result += num
	}
	result
}

result 是返回值

因为是返回值,所以 在定义的时候别忘记有 = 。

如何传递 range 序列 ?

比如上面的传递 val s = sum(1 to 10) 这样子是不对的,此时需要使用 scala 特殊的语法将参数定义为序列,让 scala 解释器能够识别。

形如这样子:

val s = sum(1 to 10: _*)

递归函数实现累加

def sum(nums: Int*):Int = {
    if(nums.length == 0) 0
    else nums.head + sum(nums.tail: _*)
}

head 是取头部第一个,后面的 nums.tail 相当于截取的子序列。

过程、lazy值和异常

过程:在 scala 中,定义函数时,如果函数体直接包括在花括号里面,而没有使用 = 连接,则函数的返回值类型就是 Unit 。这种的函数被称为过程。

过程通常用于不需要返回值的函数。

将函数的返回值类型定义为 Unit 也算是过程。

比如:

def sayName(name:String){
    print("Hi," + name);
    "Hi " + name
}

或者

def sayName(name:String):Unit = "Hi," + name

lazy 值:如果将一个变量声明为 lazy ,则只有在第一次使用该变量时,变量对应的表达式才会发生计算。

这种特性对于特别耗时的计算操作特别有用,比如打开文件进行读写,后者进行网络 IO 。

定义的时候不会被进行计算,有点像操作系统中假分配,只有使用的时候才会去进行计算,将结果返回。

即使定义的 lazy 值计算会出错,但是只是定义的话不会出错,使用的才会去验证会不会出错。

减少不必要的加载,真正使用的时候再调用。

异常:异常的处理和捕获机制与 Java 相似。

try{

}catch{

}finally{

}

例子:

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[] 。

数组初始化后,长度就固定下来,元素全部根据类型初始化。

val a = new Array[Int](10)

[ ] 里面是泛型参数,指定类型。

默认是 0 。

创建 String 类型的默认是 null 。

直接用 Array() 创建数组,元素类型自动推断。

val a = Array("hello","word")

ArrayBuffer

如果不预先导入包,那么需要使用全限定名。

如果直接使用 ArrayBuffer ,则预先导入 ArrayBuffer 类。

import scala.collection.mutable.ArrayBuffer
 val b = ArrayBuffer[Int]()
 b += 1
 b += (2,3,4)

使用 += 操作符,可以添加一个元素或者多个元素。

使用 ++= 操作符,可以添加其他集合中的所有元素。

使用 trimEnd() 函数,可以从尾部截断指定个数的元素。

使用 insert() 函数可以在指定位置插入元素。

【需要移动指定位置后的所有元素,效率较低】

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() 函数可以移出指定位置的元素。

b.remove(1)
b.remove(1,3)

这里和 insert 一样理解。

Array 和 ArrayBuffer 可以互相转换。

b.toArray
b.toBuffer

遍历 Array 和 ArrayBuffer

使用 for 循环和 until 遍历

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)

发布了356 篇原创文章 · 获赞 58 · 访问量 6万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章