在 Scala 中,把哈希表这种数据结构叫做映射, 在 Java 中也叫做映射,在 Python 中把哈希表这种数据结构叫做字典。Scala 的集合有三大类:序列 Seq、集 Set、映射 Map,所有的集合都扩展自 Iterable 。
在 Scala 中集合有可变(mutable)和不可变(immutable)两种类型, immutable 类型的集合初始化后就不能改变了(注意与 val 修饰的变量进行区别)。
构建 Map
// 方式1
val access=Map("cdh-master" -> 1, "cdh-slave01" -> 2,"cdh-slave02" -> 3)
// 方式2
val access=Map(("cdh-master",1), ("cdh-slave01",2), ("cdh-slave02",3))
// Map(cdh-master -> 1, cdh-slave01 -> 2, cdh-slave02 -> 3)
获取Map 中的值
map("cdh-master") // 1
// 有值则返回值,没有返回设置的值
map.getOrElse("cdh-master",0)
修改 Map 中的值
注意:在 Scala 中有两种 Map,immutable 包下 Map 的内容不可变,另一个是 mutable 包下的 Map 的内容可变。通常在创建一个集合是会用 val 修饰一个变量(相当于 java 中的 final),意味着该变量的引用不可变。该引用中的内容是不是可变,取决于这个引用指向的集合的类型。
// 如果导入不可变map,改变值会报错
import scala.collection.mutable.Map
// val定义的变量意味着变量的引用不可变,但map中的内容可变
val access = Map("id"->1, "uu"->1189)
access("id")=0 // Map(id -> 0, uu -> 1189)
Map 常用操作
清空可变 map
val access = scala.collection.mutable.Map("id"->1, "uu"->1189)
access.clear() // map()
遍历 map 方式1
for (i <- access)
println(i)
// (uu,1189)
// (id,1)
遍历 map 方式2
access.foreach(x => println(x._1 + ":" + x._2))
// uu:1189
// id:1
其他
val map = new scala.collection.mutable.HashMap[String,Int]() // Map()
// 赋值
map.put("scala",1) // Option[Int] = None
println(map) // Map(scala -> 1)
map.put("scala",1) // Option[Int] = Some(1)
map.contains("scala") // true
map.get("scala") // Option[Int] = Some(1)
map.get("Spark") // Option[Int] = None
Option,None,Some 类型
Option、 None、 Some 是 scala 中定义的类型,它们在 scala 语言中十分常用,因此这三个类型很重要。 None、 Some 是 Option 的子类,它主要解决值为 null 的问题,在 java 语言中,对于定义好的 HashMap,如果 get 方法中传入的键不存在,方法会返回 null,在编写代码的时候对于 null 的这种情况通常需要特殊处理,然而在实际中经常会忘记,因此它很容易引起NullPointerException 异常。在 Scala 语言中通过 Option、 None、 Some 这三个类来避免这样的问题,这样做有几个好处,首先是代码可读性更强,当看到 Option 时,我们自然而然就知道它的值是可选的,然后变量是 Option,比如 Option[String]的时候,直接使用 String 的话,编译直接通不过。