Scala 的Map集合

Map集合有两种类型,可变的与不可变的,区别在于可变对象可以修改,而不可变对象不可以修改。默认情况下Scala使用不可变Map集合,如果需要使用可变Map集合,则需要显式地使用import导入包。在Scala中,可以同时使用可变与不可变的Map集合,不可变的直接使用Map,可变的使用mutable.Map。

1.1Scala的Map继承关系

HashMap基于哈希表实现可变的版本,基于HashTrie实现不可变版本,与HashSet相似。WeakHashMap相当于一个弱引用的Map,当内存空间不足时,可以释放垃圾、回收空间。SortedMap和TreeMap只提供了不可变版本,SortedMap与SortedSet相似, TreeMap同样也是基于红黑树实现的。LinkedHashMap只提供可变的版本,保持插入集合元素的顺序不变,它也是基于哈希表实现的。ListMap有可变的和不可变的版本,与LinkedHashMap相反。

Map集合中有一个对应的SychronzedMap,Set和Seq中也有类似的方法,该方法中有很多分支。 SychronzedMap使用多线程,保证线程安全。在多线程开发时,如果要保证线程的安全,可以选择以Sychronzed开头的集合。

1.Scala的Map概述

Map(映射)是一种可迭代的键值对(Key/Value)结构,所有值都可以通过键来获取,Map中的键都是唯一的。定义Map时,需要为键值对定义类型。

1.Scala的Map的定义

在Java中,Map是以键对(K,V)的形式存在的,例如(Key1,V1)。在Scala中,Map集合同样是以键值对的方式存在的,应用非常广泛。

2.Scala的Map的创建

在Scala中,有两种创建Map的方式,分别是Map(k1->v1,k2->v2,..和Map((k1,v1),(k2,v2),...。 Map(k1->v1,k2->v2,...中的k1->v1表示第一个元素,k2->V2表示第二个元素。第二种方式Map((k1, v1),(k2,v2)...是通过元组的方式定义的。

3.Scala的Map的分类

Scala的Map有两种类型,即可变的和不可变的,这在之前介绍过。上述创建Map的方式是不可变的, 如果想创建可变的Map,需要导入指定的包,创建方式与不可变的方式相同。

1.3 Scala的可变Map常用操作

Scala的可变Map常用操作有增加、删除、修改、查询等,如表8-2所示。向Map中添加元素,可以直接使用M(k)-V的形式向集合中添加一个键值对。例如,定义一个Map集合,val m=Map(K1-2V1,K2-V2),通过m(K3)=V3向m中添加一个键值对。如果添加的K值存在,会使用新的V替换集合中原有的V值。

另外,put方法也可以使用(K,V)的形式添加,例如 put(K,V),并返回一个option类型。十=用于添加一个键值对;++=用于添加一个集合。删除操作中的Remove方法会根据K指定的值进行删除, 例如,remove(K1)表示删除与K1对应的V值。调用clear 方法会把元素清空。调用retain(方法可以根据0中表达式为真或假,判断是否保留元素。更新操作与Java 中非常相似,通过M(k)=v的形式进行更新。

查询操作有两种方式,分别是Get(key)和m(key)。通过m(key)方式中的key会返回对应的V值, 如果不是对应的值,则会抛出异常。如果不想抛出异常,可以使用Get(key)的方式。如果K和V不对应, 则会返回None。提倡使用Get(key)的方式查询值,这样不会影响整体代码的执行效率。

相关代码如下:

Scala 复制代码
//可变的Map,要导入包

import scala.collection.mutable

//类型:可变
//操作:添加元素,删除元素,查询元素,修改元素,遍历
object mutable_map {

  def main(args: Array[String]): Unit = {
    // 可变Map
    val map1 = mutable.Map("鄂" -> "湖北省", "湘" -> "湖南省", "青" -> "青海")

    //1.添加
    map1 += ("豫" -> "河南省")

    //2.删除。只需要提供key
    //map1 -= "鄂"

    //3.查询
    //3.1 get方法。输入key,如果找到,就返回包装数据,如果没有找到,就返回None
    //3.2 直接:map(key名)。如果key不存在,就会报错!
    //    val rs = map1.get("鄂")
    //    println(rs.get)
    println(map1("鄂"))

    //4.修改元素:把 青->青海,改成 青->青海省
    map1("青") = "青海省"

    //5.遍历
    //5.1 for
    //5.2 foreach
    for ((key, value) <- map1) {
      println(s"$key 是 ${value} 的简称")
    }

    map1.foreach { case (key, value) => {
      println(s"$key 是 ${value} 的简称")
    }
    }
  }
}

1.4 Scala的不可变Map常用操作

由于是不可变Map,所以不可以进行更新操作。添加、 删除、查询和遍历操作与之前介绍的操作方法相同,这里不再详细说明。

下面举例说明映射的增加、删除、修改和查询等操作。

相关代码如下:

Scala 复制代码
//类型:不可变,可变
//操作:添加元素,删除元素,查询元素,修改元素,遍历
object map {
  def main(args: Array[String]): Unit = {
    //不可变Map
    val map1 = Map("鄂" -> "湖北省", "湘" -> "湖南省")

    //1.添加
    val map2 = map1 + ("豫" -> "河南省")
    //如果key存在,就是修改
    //    val map3 = map1 + ("鄂"->"河南省")

    //2.删除。只需要提供key
    val map3 = map1 - "鄂"

    //3.查询
    //3.1 get方法。输入key,如果找到,就返回包装数据,如果没有找到,就返回None
    //3.2 直接:map(key名)。如果key不存在,就会报错!
    //    val rs = map1.get("鄂")
    //    println(rs.get)
    //    println(map1("鄂1"))

    //4.修改元素:把 青->青海,改成 青->青海省
    //    map1("青") = "青海省"
    val map4 = map1 + ("青" -> "青海省 ")

    //5.遍历
    //5.1 for
    //5.2 foreach
    for ((key, value) <- map1) {
      println(s"$key 是 ${value} 的简称")
    }

    //    map1.foreach{case (key,value) => {
    //      println(s"$key 是 ${value} 的简称")
    //    }}
  }
}
相关推荐
云空2 分钟前
《解锁 Python 数据挖掘的奥秘》
开发语言·python·数据挖掘
秋意钟8 分钟前
Spring新版本
java·后端·spring
青莳吖13 分钟前
Java通过Map实现与SQL中的group by相同的逻辑
java·开发语言·sql
Buleall20 分钟前
期末考学C
java·开发语言
重生之绝世牛码22 分钟前
Java设计模式 —— 【结构型模式】外观模式详解
java·大数据·开发语言·设计模式·设计原则·外观模式
小蜗牛慢慢爬行28 分钟前
有关异步场景的 10 大 Spring Boot 面试问题
java·开发语言·网络·spring boot·后端·spring·面试
Algorithm157638 分钟前
云原生相关的 Go 语言工程师技术路线(含博客网址导航)
开发语言·云原生·golang
shinelord明1 小时前
【再谈设计模式】享元模式~对象共享的优化妙手
开发语言·数据结构·算法·设计模式·软件工程
A小白59081 小时前
Docker部署实践:构建可扩展的AI图像/视频分析平台 (脱敏版)
后端
Monly211 小时前
Java(若依):修改Tomcat的版本
java·开发语言·tomcat