7.1 映射 Map-基本介绍
- Scala中的Map 和Java类似,也是一个散列表,它存储的内容也是键值对(key-value)映射,Scala中不可变的Map是有序的,可变的Map是无序的。
- Scala中,有可变Map (scala.collection.mutable.Map) 和
不可变Map(scala.collection.immutable.Map)
7.2 构建Map
7.2.1 方式1-构造不可变映射
Scala中的不可变Map是有序,构建Map中的元素底层是Tuple2类型。
val map1 = Map("Alice" -> 10, "Bob" -> 20, "Kotlin" -> "北京") |
小结:
1.从输出的结果看到,输出顺序和声明顺序一致
2.构建Map集合中,集合中的元素其实是Tuple2类型
3.默认情况下(即没有引入其它包的情况下),Map是不可变map
7.2.2方式2-构造可变映射
//需要指定可变Map的包 val map2 = scala.collection.mutable.Map("Alice" -> 10, "Bob" -> 20, "Kotlin" -> 30)
|
说明
- 从输出的结果看到,输出顺序和声明顺序不一致
7.2.3 方式3-创建空的映射
val map3 = new scala.collection.mutable.HashMap[String, Int] println(map3) |
7.2.4 方式4-对偶元组
即创建包含键值对的二元组, 和第一种方式等价,只是形式上不同而已。
对偶元组 就是只含有两个数据的元组。
val map4 = mutable.Map( ("A", 1), ("B", 2), ("C", 3),("D", 30) ) println("map4=" + map4) println(map4("A")) |
7.3 Map取值
7.3.1 方式1-使用map(key)
val value1 = map2("Alice") println(value1) |
说明:
1) 如果键存在, 返回对应的值对象
2) 如果键不存在, 抛出异常
3) 在java中 如果不存在返回null
7.3.2 方式2-使用contains方法检查是否存在key
// 返回Boolean // 1.如果key存在,则返回true // 2.如果key不存在,则返回false val map4 = mutable.Map( ("A", 1), ("B", 2), ("C", 3),("D", 30.9) ) if( map4.contains("B") ) { println("key存在 值= " + map4("B")) } else { println("key不存在") } |
说明:使用containts先判断在取值,可以防止异常,并加入相应的处理逻辑。
7.3.3 方式3-使用map.get(key).get取值
通过映射.get(键) 这样的调用返回一个Option对象,要么是Some,要么是None
var map4 = mutable.Map( ("A", 1), ("B", "北京"), ("C", 3) ) println(map4.get(“X")) //None println(map4.get(“X").get) //得到Some再取出 |
说明:
- map.get方法会将数据进行包装
- 如果 map.get(key) key存在返回some,如果key不存在,则返回None
- 如果 map.get(key).get key存在,返回key对应的值,否则,抛出异常 java.util.NoSuchElementException: None.get
7.3.4 方式4-使用map4.getOrElse()取值
getOrElse 方法 : def getOrElse[V1 >: V](key: K, default: => V1)
说明:
- 如果key存在,返回key对应的值;
- 如果key不存在,返回默认值。在java中底层有很多类似的操作。
val map4 = mutable.Map( ("A", 1), ("B", "北京"), ("C", 3) ) println(map4.getOrElse("A","默认")) |
7.3.5 如何选择取值方式建议
- 如果我们确定key是存在的,应该使用map("key") ,速度快.
- 如果我们不确定key是否存在, 而且在不存在时,有业务逻辑处理就是用map.contains() 配合 map("key")
- 如果只是简单的希望返回一个值,就使用getOrElse()
7.4 对map修改、添加和删除
7.4.1 更新map的元素
val map4 = mutable.Map( ("A", 1), ("B", "北京"), ("C", 3) ) map4(“A”) = 20 //修改或增加 println(map4) |
说明:
- map 是可变的,才能修改,否则报错;
- 如果key存在:则修改对应的值,key不存在,等价于添加一个key-val
7.4.2 添加map元素
方式1-增加单个元素
val map4 = mutable.Map( ("A", 1), ("B", "北京"), ("C", 3) ) map4 += ( "D" -> 4 ) map4 += ( "B" -> 50 ) println(map4) |
思考:如果增加的key 已经存在会怎么样?
方式2-增加多个元素
val map4 = mutable.Map( ("A", 1), ("B", "北京"), ("C", 3) ) val map5 = map4 + ("E"->1, "F"->3) map4 += ("EE"->1, "FF"->3) |
7.4.3 删除map元素
val map4 = mutable.Map( ("A", 1), ("B", "北京"), ("C", 3) ) map4 -= ("A", "B") println("map4=" + map4) |
说明:
- "A","B" 就是要删除的key, 可以写多个.
- 如果key存在,就删除,如果key不存在,也不会报错.
7.5 对map遍历
对map的元素(元组Tuple2对象 )进行遍历的方式很多,具体如下:
val map1 = mutable.Map( ("A", 1), ("B", "2"), ("C", 3) ) for ((k, v) <- map1) println(k + " is mapped to " + v) for (v <- map1.keys) println(v) for (v <- map1.values) println(v) for(v <- map1) println(v) |