开发者学堂课程【Scala 核心编程 - 进阶:Map 的四种取值方式】学习笔记,与课程紧密连接,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/610/detail/9041
Map 的四种取值方式
内容介绍:
一、使用 map(key)
二、使用 contains 方法检查是否存在 key
三、使用 map.get(key).get 取值
四、使用 map4.getOrElse() 取值
五、如何选择取值方式建议
一、使用 map(key)
1.实例:
val value1=map(“Alice”)
println(value1)
2.演示:
以 map4为例(部分代码):
val map4 = mutable.Map(("Alice",10),("Bob",20), ("Kotlin",”北京”))
println(map1(“Alice”)) //输出结果为10
println(map4(“Alice~”)) //抛出异常
3.说明
(1)key 存在,则返回值对应的值
(2)如果 key 不存在,则抛出异常
[java.util.NoSuchElementException]
(3)在 Java 中,如果 key 不存在则返回 null
4.缺点
对用户来说,看不懂的异常直接出现在屏幕上会产生不好的体验。
没有防护机制,并且直接抛出异常容易暴露内部信息,造成攻击。
异常信息不能直接暴露出来,所以下面的方式可以避免该问题。
二、使用 contains 方法检查是否存在 key
1.实例(重要代码)
(1)val map4 = mutable.Map(("Alice",10),("Bob",20), ("Kotlin",”北京”))
if (map4.contains(“Alice~”)){
/
/
注意:取值的方法不管是可变还是不可变都是一样的
println(“key 存在,值=”+map4(“Alice~”))
}
else{
println(“ key 不存在”)
运行结果:key 不存在
(2)val map4 = mutable.Map(("Alice",10),("Bob",20), ("Kotlin",”北京”))
if (map4.contains(“Alice”)){
/
/
注意:取值的方法不管是可变还是不可变都是一样的
println(“key 存在,值=”+map4(“Alice~”))
}
else{
println(“ key 不存在”)
运行结果:key 不存,值=
10
2.返回值
返回 Boolean
(1)如果 key 存在,则返回 true
(2)如果 key 不存在,则返回 flase
3.说明
使用 contains 先判断再取值,可以防止异常,并加入相应的处理逻辑
4.缺点:
不够简洁
5.改进思路
例如,SpringMVC 中的标签,取出返回一个值,不取出返回返回一个默认值。
三、使用 map.get(key).get 取值
通过 映射 get(键) 这样的调用返回一个 Option 对象,要么是 Some,要么是 None(Some 是 Option 的一个子类)
1.实例
val map4 = mutable.Map(("Alice",10),("Bob",20), ("Kotlin",”北京”))
println(map4.get(“Alice”))
//返回的不是一个值,而是 Some ,Some 中可以包含该值
运行结果为:Some(10)
如果要取出具体的值,则可以用get,如下
println(map4.get(“Alice”).get)
运行结果为:10
此时如果 key 不存在,会抛出异常,因为已经是 None ,无法再取出,所以会抛出异常,代码为:println(map4.get(“Alice~”).get)
2.注意:
如果 key 存在,map.get(key) 就会返回Some (值),然后 Some(值).get 就可以取出
如果 key 不存在, map.get(key) 就会返回 None,此时不能再 map.get(key).get ,否则会抛出异常 Exception in thread "main" java.util.NosuchElementException: None.get
四、使用 map4.getOrElse() 取值
1.getOrElse 方法:
def getOrElse[V1>:V] [key:k,default:=>V1]
2.说明:
(1)如果 key 存在,返回 key 对应的值。
(2)如果 key 不存在,返回默认值。在 jav 有中底层有很多类似的操作。
3.实例(主要代码):
(1)val map4 = mutable.Map(("Alice",10),("Bob",20), ("Kotlin",”北京”))
println(map4. getOrElse(“Alice”,”默认的值鱼 <*)))><<”))
运行结果:10
(2)val map4 = mutable.Map(("Alice",10),("Bob",20), ("Kotlin",”北京”))
println(map4. getOrElse(“Alice~”,”默认的值鱼 <*)))><<”))
运行结果:默认的值鱼 <*)))><<
此时,“Alice~”不存在,其底层相当于做了一个 else 的返回,说明该方法包裹了一个 if else,当不存在时,返回默认值。
所以上面是一个不存在的 key,则会返回:默认的值 鱼 <*)))><<
(推荐方式四,比较简洁)
五、如何选择取值方式建议
方法没有被淘汰,说明其还有可取之处
1.如果我们确定 map 有 key ,则应当使用 map(key)。
这样效率很高,因为确定 map 有 key ,所以没有含多余的东西,速度快
2.如果我们不能确定 map 是否有 key ,而且有不同的业务逻辑,使用 map.contains() 先判断再加入逻辑。
不同的业务逻辑,当 key 存在时如何,当 key 不存在时又如何,不是简单的返回一个默认值。
3.如果只是两个简单的希望得到一个值,使用 map.getOrElse (“”) .
比如,假设要连接一个 IP 地址,如果取不到就可以连接本地(非此及彼的情况下,这样更高效)