Scala中的映射是键/值对的集合。任何值可以根据它的键进行检索。键是在映射唯一的,但值不一定是唯一的。映射也被称为哈希表。有两种类型的映射,不可变以及可变的。可变和不可变的对象之间的区别在于,当一个对象是不可变的,对象本身不能被改变。
默认情况下,Scala中使用不可变的映射。如果想使用可变集,必须明确地导入scala.collection.mutable.Map类。如果想在同一个同时使用可变和不可变的映射,那么可以继续参考不可变的映射作为映射,但可以参考可变集合为mutable.Map
1、map的基本操作
val map = Map("a"->1,"b"->2)
//映射的值可以是映射甚或是函数
//res14: scala.collection.immutable.Map[String,scala.collection.immutable.Map[String,Int]] = Map(a -> Map(b -> 4))
var map1 = Map("a" -> Map("b" -> 4))
var map2 = Map(1 -> {operate(1)})
def operate(v:Int):Int = {
v * 2
}
2、获取value的值
/**
* map 返回的是一个Option
* Option本身是泛型的,并且有两个子类: Some[T] 或 None
* Option 基本的接口
*/
def isEmpty: Boolean //判断Option是否是$none
def isDefined: Boolean = !isEmpty //判断Option是否是$some
def get: A //从Option中获取值
Some和None源码
@SerialVersionUID(1234815782226070388L) // value computed by serialver for 2.11.2, annotation added in 2.11.4
final case class Some[+A](@deprecatedName('x, "2.12.0") value: A) extends Option[A] {
def isEmpty = false
def get = value
@deprecated("Use .value instead.", "2.12.0") def x: A = value
}
/** This case object represents non-existent values.
*
* @author Martin Odersky
* @version 1.0, 16/07/2003
*/
@SerialVersionUID(5066590221178148012L) // value computed by serialver for 2.11.2, annotation added in 2.11.4
case object None extends Option[Nothing] {
def isEmpty = true
def get = throw new NoSuchElementException("None.get")
}
//Option[Int] = Some(1)
//Map.get 使用 Option 作为其返回值,表示这个方法也许不会返回你请求的值
val res = map.get("a")
//Option[Int] = None
map.get("c")
//如果要从map中获取key所对应的值
if(res.isDefined) operate(res.get) else None
//上面的代码应该用下面的方式替代
res.foreach(v => operate(v))
//getOrElse表示如果没有值就会使用默认值0 建议使用getOrElse或模式匹配处理这个结果
val value1 = res.getOrElse(0)
//模式匹配能自然地配合Option使用
/**
* 类似 java中的 swith case
*/
var result = res match {
case Some(n) => n * 2
case None => 0
}
/**
* Option类型是一个容器,空(None)或满(Some(value))二选一。它提供了使用null的另一种安全选择,应该尽可能的替代null。
* 它是一个集合(最多只有一个元素)并用集合操所修饰,尽量用Option
*/
var username: Option[String] = None
username = Some("foobar")
//代替
//var username: String = null
//username = "foobar"
//因为前者更安全:Option类型静态地强制username必须对空(emptyness)做检测
3、串联映射
val colors1 = Map("red" -> "#FF0000",
"azure" -> "#F0FFFF",
"peru" -> "#CD853F")
val colors2 = Map("blue" -> "#0033FF",
"yellow" -> "#FFFF00",
"red" -> "#FF0000")
// use two or more Maps with ++ as operator
var colors = colors1 ++ colors2
println( "colors1 ++ colors2 : " + colors )
// use two maps with ++ as method
colors = colors1.++(colors2)
println( "colors1.++(colors2)) : " + colors )
//打印映射的键和值
colors.keys.foreach{ i =>
print( "Key = " + i )
println(" Value = " + colors(i) )}
//使用apply来根据key取值
/**
* 其实内部还是使用了get方法 使用模式匹配来获取值
* 如果不存在会报错:Exception in thread "main" java.util.NoSuchElementException: key not found: green
* 所以不建议这样根据key来单个取值
* def apply(key: K): V = get(key) match {
* case None => default(key)
* case Some(value) => value
* }
*
* def default(key: K): V =
* throw new NoSuchElementException("key not found: " + key)
*/
println("single value="+colors("green"))