Scala Map详解

Scala中Map继承自Iterator特质,是一组(K,V)对偶。其子类SortedMap按照Key排序访问其中的实体。

1.可变map和不可变map

scala同时支持可变和不可变map。不可变map从不改变,因此你可以线程安全的共享其引用,在多线程的应用程序中也没问题。举例来说,既有scala.collection.mutalbe.Map,也有scala.collection.immutalbe.Map。他们有一个公共超类scala.collection.Map,该类中没有定义任何修改值的方法。
当你握有一个指向scala.collection.immutable.Map的引用时,没有人可以修改他。如果你有一个scala.collection.Map,那么你不能改变他,但别人也许会。
Scala优先使用使用不可变集合。scala.collection包中的伴生对象产出不可变集合。例如:scala.collection.Map(“Hello” -> 42)是一个不可变的集合。
不仅如此,总被引入scala包和Predef对象里有不可变map的别名Map。也就是说Predef.Map和scala.collection.immutable.Map是一回事。
当你导入import scala.colection.mutable包之后,你就可以用Map得到不可变map,用mutable.Map得到可变的map。

2.构造映射

//  构造一个不可变集合,其值不能改变
    val scores = Map("Alice" -> 10,"Bob" -> 3)
//  val socres = Map(("Alice" ,10),("Bob" ,3)) 也可以这样构造,操作符->用来创建对偶
    //  导入import scala.colection.mutable包之后,你就可以用Map得到不可变map,用mutable.Map得到可变的map
    import scala.collection.mutable
    val scores2 = mutable.Map("Alice" -> 10,"Bob" -> 3)
//  如果你想由一个空的映射开始,你需要选定一个映射实现并给出类型参数
    val scores3 = new HashMap[String,Int]

3.获取映射中的值

在Scala中,map和函数很相似,你也可以使用()来查找键值。

val bobsScore = scores("Bob")
//  上面的方法比较危险,如果map中没有该key,会报错
//  因此可以使用contains方法来检查
    val bs = if(scores.contains("Bob")) scores("Bob") else 0
//  这样很麻烦,还有更好的方式
    val bs2 = scores.getOrElse("Bob", 0)//如果包含Bob,返回对应的value;否则0 

4.更新映射中的值

在可变集合中,可以使用在=号的左侧使用():

    scores("Bob") = 10 //更新"Bob"得值
    scores("Fred") = 7//增加新的键
//  也可以用+=操作来添加多个关系,变量得声明为var
    scores += ("Marry" -> 4,"Jack" -> 5)
//  也可以使用 -=来移除某个关系
    scores -= ("Alice")
//  虽然不能更新一个不可变map,但是可以使用相同的操作
    var newScores = Map(1 -> 1,2 -> 2) + (3 -> 3)//更新过的新映射
    newScores -= 1//移除一个对偶
//  你可能觉得这样不停创建新映射效率很低,但其实新老映射共享大部分数据结构

5.迭代映射

//  迭代映射
    for((k,v) <- scores)println(k+" -> "+v)
//  可能只需要访问value部分
    for(v <- scores.values)println("values : "+v)
//  或者只需要访问key部分这两种方法完全一样 内部def keys: Iterable[K] = keySet
    for(k <- scores.keys)println("keys : "+k)
    for(k <- scores.keySet)println("keySet : "+k)
//  还可以交换KV
    for((k,v) <- scores) yield(v,k)

6.已排序的映射

//  默认是使用Hash表实现的
    val scores4 = collection.immutable.SortedMap("Fred" -> 7,"Alice" -> 10,"Marry" -> 4,"Jack" -> 5,"Bob" -> 3)
//  如果要按插入顺序访问所有Key,使用LinkedHashMap
    val months = collection.mutable.LinkedHashMap("January" -> 1,"February" -> 2,"March" -> 3)
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值