Map 的四种取值方式 | 学习笔记

简介: 快速学习 Map 的四种取值方式

开发者学堂课程【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 地址,如果取不到就可以连接本地(非此及彼的情况下,这样更高效)

相关文章
|
6月前
|
存储 C++ 容器
【C++】学习笔记——map和set
【C++】学习笔记——map和set
36 0
|
前端开发
前端学习笔记202306学习笔记第三十八天-手写map2
前端学习笔记202306学习笔记第三十八天-手写map2
124 0
前端学习笔记202306学习笔记第三十八天-手写map2
|
前端开发
前端学习笔记202305学习笔记第二十七天-什么是对象结构 set map之8
前端学习笔记202305学习笔记第二十七天-什么是对象结构 set map之8
44 0
|
前端开发
前端学习笔记202305学习笔记第二十五天-什么是对象结构 set map之4
前端学习笔记202305学习笔记第二十五天-什么是对象结构 set map之4
60 0
|
7月前
|
分布式计算 JavaScript 前端开发
Stream学习笔记(二)map与reduce
Stream学习笔记(二)map与reduce
|
7月前
|
存储 JavaScript
【ES6系列第二篇】适用JS初学者的Set对象和Map对象学习笔记
【ES6系列第二篇】适用JS初学者的Set对象和Map对象学习笔记
52 0
|
前端开发
前端学习笔记202305学习笔记第二十八天-什么是对象结构 set map之13
前端学习笔记202305学习笔记第二十八天-什么是对象结构 set map之13
40 0
前端学习笔记202305学习笔记第二十八天-什么是对象结构 set map之13
|
前端开发
前端学习笔记202306学习笔记第四十二天-Es6-Map的理解1
前端学习笔记202306学习笔记第四十二天-Es6-Map的理解1
54 1
|
前端开发
前端学习笔记202305学习笔记第二十五天-什么是对象结构 set map之5
前端学习笔记202305学习笔记第二十五天-什么是对象结构 set map之5
46 0
|
前端开发
前端学习笔记202305学习笔记第二十六天-什么是对象结构 set map之6
前端学习笔记202305学习笔记第二十六天-什么是对象结构 set map之6
61 0