Scala系列
Posted 莫同学vv
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Scala系列相关的知识,希望对你有一定的参考价值。
这是 Scala 编程的第二篇
变长参数
Scala 中也可以将函数定义为参数个数可变的形式,可以使用变长参数来定义函数,例如:
// 在数据类型后加上星号 * ,代表可变成参数
def sum(nums:Int*)={
var i = 0
for(num<-nums) res += num
res
}
使用序列调用变长参数函数
一个已有的序列调用变长参数函数,例如:
// 错误写法
val i = sum(1 to 5)
// 正确写法
val i = sum(1 to 5:_*)
使用递归函数实现累计,例如:
def sum(nums:Int*):Int = {
if(nums.length == 0) 0
else nums.head + sum(nums.tail:_*)
}
函数的过程
如果函数体直接写在花括号里,不使用等号连接,那么函数的返回值类型就是Unit,这样的函数称之为过程,它不需要返回值,或者将返回值的类型定义为Unit,例如:
// 正常函数写法
def test(str:String) = str
// 过程的写法,不需要等号来连接花括号中的函数体
def test(str:String){
print(str)
}
// 或者将函数的返回值的类型定义为Unit
def test(str:String):Unit = str
lazy 修饰符
如果一个变量用 lazy 修饰,那么只有在第一次使用该变量时,该变量的表达式才会进行计算,这种特性对耗时的操作特别有用,比如打开文件,进行网络 IO 等等,例如:
import scala.io.Source._
lazy val text = fromFile("C://test.txt").mkString
如果文件不存在也不会报错,只有使用了该变量时才会报错
异常
Scala 中的异常处理和捕获机制与 Java 相似,区别在 catch 中用模式匹配来匹配异常,例如:
try{
throw new IOException("user defined exception")
}catch{
case e1:illegalArgumentException => println("illegal argument")
case e2:IOException => println("io exception")
}
数组Array
Array 是长度不可改变的数组,底层实际上是 Java 数组,字符串数组在底层就是 Java 的 String[],整数数组底层就是 Java 的 Int[],数组初始化后长度就固定下来了,例如:
// 定义数组时,指定数组类型
val a = new Array[Int](5)
val b = new Array[String](5)
// 可以使用 Array() 创建数组,元素类型会自动推断
val c = Array("zhangsan","lisi")
ArrayBuffer
ArrayBuffer 类似 Java 中的 ArrayList,是一种可变长度的集合类
// 使用 ArrayBuffer 要预先导入类
import scala.collection.mutable.ArrayBuffer
// 创建一个空的 ArrayBuffer
val a = ArrayBuffer[Int]()
// 使用 += 操作符来添加一个或多个元素
a += 1
a += (2,3,4)
// 使用 ++= 操作符来添加集合中所有元素
a ++= Array(5,6,7)
// 使用 trimEnd() 函数从尾部截取指定个数的元素
a.trimEnd(3)
// 使用 insert() 函数在指定位置插入元素,效率很低,因为要移动该元素后的所有元素
a.insert(5,6)
a.insert(5,6,7,8)
// 使用 remove() 函数移除指定位置的元素
a.remove(1)
a.remove(1,3)
// Array 与 ArrayBuffer 可以互相转换
a.toBuffer
a.toArray
遍历 Array 和 ArrayBuffer
// 使用 for 循环和 until 遍历 Array 和 ArrayBuffer,until 是 RichInt 提供的函数
for(i <- 0 until a.length) println(a(i))
// 跳跃遍历 Array 和 ArrayBuffer
for(i <- 0 until (a.length,2)) println(a(i))
// 从尾部遍历 Array 和 ArrayBuffer
for(i <- (0 until a.length).reverse) println(a(i))
// 使用 “增强 for 循环” 遍历 Array 和 ArrayBuffer
for(e <- b) println(e)
数组常用的操作
// 数组元素求和
val a = Array(1,2,3)
val b = a.sum
// 获取数组最大值
val c = a.max
// 对数组进行排序
scala.util.Sorting.quickSort(a)
// 获取数组中所有元素
a.mkString
// 获取数组中所有元素,用逗号隔开
a.mkString(",")
// 转换数组数据类型
a.toString
使用 yield 和函数式编程转换数组
// 对 Array 进行转换
val a = Array(1,2,3)
val b = for(i <- a) yield i * i
// 对 ArrayBuffer 进行转换
val c = ArrayBuffer[Int]()
c += (1,2,3)
val d = for(i <- c) yield i * i
// 用 if 守卫转换需要的元素
val e = for(i <- if i % 2 ==0) yield i * i
// 使用函数式编程转换数组
a.filter(_ % 2 == 0).map(2 * _)
a.filter(_ % 2 == 0).map{2 *_}
创建 Map
// 创建一个不可变的 Map
val ages = Map("zhangsan" -> 10, "lisi" -> 20, "wangwu" ->30)
// 创建一个可变的 Map
val ages = scala.collection.mutable.Map("zhangsan" -> 10, "lisi" -> 20, "wangwu" ->30)
// 使用另一种方式定义 Map
val ages = Map(("zhangsan",10),("lisi",20),("wangwu",30))
// 创建一个空的 HashMap
val ages = new scala.collection.mutable.HashMap[String,Int]
访问 Map 的元素
// 获取指定 key 的 value,如果 key 不存在则报错
val age = ages("zhangsan")
// 使用 contains 函数检查 key 是否存在
val age1 = if(ages.contains("zhangsan")) ages("zhangsan") else 0
// 使用 getOrElse 函数获取值,如果 key 不存在则返回默认值
val age2 = ages.getOrElse("zhangsan",0)
更新 Map 的元素
// 通过重新赋值更新 Map 的元素
ages("zhangsan") = 20
// 用 += 操作符增加多个元素
ages += ("zhaoliu" -> 35, "tom" -> 36)
// 用 -= 操作符移除元素
ages -= "zhangsan"
// 更新不可变的 Map
val ages2 = ages + ("zhaoliu" -> 40, "tom" -> 41)
// 移除不可变 Map 的元素
val ages3 = ages - "tom"
遍历 Map
// 遍历 map 的 entrySet
for((key,value) <- ages) println(key + "" +value)
// 遍历 map 的 key
for(key <- ages.keySet) println(key)
// 遍历 map 的 value
for(value <- ages.values) println(value)
// 用 yiled 生成新的 map,反转 key 和 value
for((key,value) <- ages) yield (value,key)
SortedMap 和 LinkedHashMap
// SortedMap 可以自动对 Map 的 key 进行排序
val ages = scala.collection.immutable.SortedMap("zhangsan" -> 10,"lisi" -> 20,"wangwu" -> 30)
// LinkedHashMap 可以记住 entry 的插入顺序
val ages = new scala.collection.mutable.LinkedHashMap[String,Int]
ages("zhangsan") = 10
ages("lisi") = 20
ages("wangwu") = 30
Tuple
// 创建 Tuple
val t = ("zhangsan",10)
// 访问 tuple 里的值
t._1
// zip 的组合操作
val names = Array("zhangsan","lisi","wangwu")
val ages = Array(10,20,30)
val testZip = names.zip(ages)
for((name,age) <- testZip) println(name + "" + age)
以上是关于Scala系列的主要内容,如果未能解决你的问题,请参考以下文章