目录
摘要
不可变映射,可变映射,对偶,访问元素,访问不存在的元素,更新可变和不可变映射,遍历,反转映射,有序映射(平衡树,插入顺序),与 Java Map 的互相转换,创建元组,访问元组元素,赋值给多个变量,拉链操作
映射和元组
映射
定义
- 对偶是由两个值构成的组。
- 映射是对偶的集合。
- 在 Scala 中,默认的映射是不可变的映射。
构造映射
不可变映射
val scores = Map("Alice" -> 10, "Bob" -> 3)
可变映射
val scores2 = scala.collection.mutable.Map("Alice" -> 10, "Bob" -> 3)
可以用 ->
表示对偶,也可以用括号表示。
val scores3 = Map(("Alice", 10), ("Bob", 3))
访问元素
访问元素的结构类似函数调用,使用括号表示
var bobScore = scores("Bob")
如果试图访问不存在的 key
时,会抛出 key not found
异常,所以需要在访问前先进行判断
var aliceScore = if (scores.contains("Alice")) scores("Alice") else 0
也可以使用上述的简写方式
var janeScore = scores.getOrElse("Jane", 0)
更新元素
可变映射
更新或插入新元素
scores2("Bob") = 20
插入多个元素
scores2 +=("Jane" -> 5, "Peter" -> 11)
删除元素
scores2 -= "Alice"
不可变映射
不可变映射不可以被修改,但是可以通过一些操作返回新的映射
var newScores = scores + ("Jane" -> 7) - "Bob"
遍历
遍历 entry
for ((k, v) <- newScores) {
}
只遍历 key 或 value
val keys = newScores.keySet
val values = newScores.values
for (k <- keys) {
}
反转映射
即 key 和 value 交换
val inverseScore = for ((k, v) <- newScores) yield (v, k)
有序映射
基于平衡树的有序映射只有不可变版本
val treeSortedScores = scala.collection.immutable.SortedMap("Alice" -> 10, "Fred" -> 7, "Bob" -> 3)
基本插入顺序的有序映射只有可变版本
val sortedScores = scala.collection.mutable.LinkedHashMap("Alice" -> 10, "Fred" -> 7, "Bob" -> 3)
与 Java Map 的互相转换
Java Map -> Scala Map
import scala.collection.JavaConversions.mapAsScalaMap
val javaMap = new java.util.HashMap[String, Integer]()
javaMap.put("Jane", 10)
javaMap.put("Tina", 20)
val scalaMap: scala.collection.mutable.Map[String, Integer] = javaMap
Scala Map -> Java Map
import scala.collection.JavaConversions.mapAsJavaMap
val javaMapAgain = new util.HashMap[String, Integer](scalaMap)
javaMapAgain.put("Linda", 30)
元组 Tuple
定义
- 对偶是元组的最简单形态
- 元组是不同类型的值的聚集
创建元组
val tuple = (1, 3.14, "Hello World")
访问元素
元组的序号是从 1
开始的
val value = tuple._2
将元组的值赋给不同变量
val (first, second, third) = tuple
如果需要省略某个值,可以使用 _
val (one, two, _) = tuple
此用法适合于当一个函数的返回值为多条时
拉链操作
用于将多个值组合在一起
val symbols = Array("<", "-", ">")
val counts = Array(2, 10, 2)
val pairs = symbols.zip(counts)
组合后的值可以转为映射
val map = pairs.toMap