Scala学习笔记--第5章 映射(Map)

5.1 构造映射

Scala构造映射与Java有很大的区别,基本语法如下:

val scores = Map(“Allan” -> 60, “Kevin” -> 70, “Kobe” ->80)

scores就是一个映射,但它是不可变的,如果要你想改变映射中的元素,那么就需要用到scala的mutable包:

val scores = scala.collection.mutable.Map(“Allan” -> 60, “Kevin” -> 70, “Kobe” ->80)

当然,你也可以创建一个空的映射,后续根据业务来往映射里面添加元素,但这种空的映射则需要指定key value的类型:

val scores = scala.collection.mutable.HashMap[String, Int]

这个跟Java中的Map相似,只不过Java中的语法是用<>来指定了key和value的类型:

Map<String, int> map = new HashMap<String, int>()

当然,定义映射还有另外一种方式:

val scores = Map((“Allan” ,60), (“Kevin” ,70), (“Kobe”,80))

虽然这种方式实现的效果是一样的,但是在Scala中,一般都不会采用这种方式。

映射已经创建好,如何取映射中的元素和修改元素,详见示例。


5.2 映射取值

Scala中,取映射的值和函数相似,用()符号就可以查找某个键对应的值,如果映射并不包含请求中的键,则会抛出异常。

检查某个指定键的值,可以用contains方法:

val englishScore = if (scores.contains(“english”)) scores(“english”) else 0

还有一种更简洁的写法:

val englishScore = scores.getOrElse(“english”, 0)。

5.3 更新映射的值

如要更新映射中的值,前提条件该映射是可变的,即为mutable下面的Map,添加一个映射键值对,直接使用=号进行赋值即可,例如:

scores(“Allan”) = 50   // 将键为Allan的值更新为50

scores(“Jack”) = 100  // 增加新的键值对

scores += (“Jack” -> 100) // 这样也是增加一个新的键值对

scores += (“Jack” -> 100, “Rose” -> 90)  // 一次增加多个键值对

scores -= “Jack”  // 移除一个键值对

5.4 映射迭代

遍历映射中所有键值对语法:

for ((k, v) <- 映射)  k表示键,v表示值,可以在Scala的循环中使用模式匹配,如果只需要键或值,可以像Java一样,用keySet和values方法,values返回一个Iterable,然后在for循环中使用Iterable取值。

如果要将key和value反转,即交换键和值得位置,语法如下:

for ((k, v) <- 映射)  yield (v, k) ,详见后面的示例。

5.5 与Java的互操作

如果通过Java得到一个Java映射,即Map,把它转换成一个Scala映射,需要用到scala.collection.JavaConversions.mapAsScalaMap,然后通过制定Scala映射类型触发转换。

val scores: scala.collection.mutable.Map[String, Int] = new java.util.TreeMap[String, Int]

除此之外,还可以将java.util.Properties转换成Scala映射。

val props: scala.collection.Map[String, String] = System.getProperties()

反过来,Scala映射也可以转换成Java映射。

代码示例:


object MapTest {
  def main(args : Array[String]) {
    // 定义一个不可修改的映射
    val map = Map("iphone4" -> 10, "iphone5" -> 20, "iphone6" -> 30)
    for ((k, v) <- map) yield(k, v * 2) 
    
    for ((k, v) <- map) println("key is " + k, " value is " + v)
    
    // 定义一个可变的映射
    val scores = scala.collection.mutable.Map("English" -> 80, "Math" -> 90)
    
    println("可变的key value")
    for ((k, v) <- scores) println("key is " + k, " value is " + v)
    
    // 加key value
    scores += ("Music" -> 100)
    
    println("加key value")
    for ((k, v) <- scores) println("key is " + k, " value is " + v)
    
    // 减key  value
    scores -= "English"
    println("减key value")
    for ((k, v) <- scores) println("key is " + k, " value is " + v)

    // 判断是否有键为English的值,如果没有,则默认为0
    val englishScore = scores.getOrElse("english", 0)
    println(englishScore)
  }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值