【Scala集合】17、键值对Map

在这里插入图片描述

在 Scala 中,Map 是一种键值对的集合,用于存储一组互相关联的元素。Scala 提供了可变(Mutable)Map 和不可变(Immutable)Map 两种类型。

一、可变Map

可变 Map 具有添加、删除和更新元素的能力,并且可以原地修改 Map。可变 Map 的类位于 scala.collection.mutable 包下。

示例使用可变 Map:

import scala.collection.mutable.Map

// 创建可变 Map
val mutableMap = Map("a" -> 1, "b" -> 2, "c" -> 3)

// 添加元素
mutableMap += ("d" -> 4)

// 删除元素
mutableMap -= "b"

// 更新元素
mutableMap("c") = 30

// 输出可变 Map
println(mutableMap) // 输出:Map(a -> 1, c -> 30, d -> 4)

二、不可变Map

不可变 Map 是不可更改的,一旦创建后,就不能修改它们。要添加、删除或更新元素,会返回一个新的 Map。不可变 Map 的类位于 scala.collection.immutable 包下。

示例使用不可变 Map:

// 创建不可变 Map
val immutableMap = Map("a" -> 1, "b" -> 2, "c" -> 3)

// 添加元素(会返回一个新的 Map)
val newImmutableMap = immutableMap + ("d" -> 4)

// 删除元素(会返回一个新的 Map)
val newerImmutableMap = newImmutableMap - "b"

// 输出原始不可变 Map 和新的 Map
println(immutableMap) // 输出:Map(a -> 1, b -> 2, c -> 3)
println(newerImmutableMap) // 输出:Map(a -> 1, c -> 3, d -> 4)

注意:在 Scala 中,强烈推荐使用不可变集合类型,包括不可变 Map。不可变集合具有更好的线程安全性和函数式编程特性,可以避免在多线程环境下出现竞态条件和数据共享问题。可变集合更适用于一些特定的场景,如性能要求较高且并发需求较低的情况。在大多数情况下,应该优先使用不可变集合。

三、Map遍历方式

在 Scala 中,可以使用多种方式来遍历 Map 中的键值对。以下是几种常见的遍历方式:

  1. 使用 foreach 方法遍历 Map 中的键值对:
val myMap: Map[String, Int] = Map("a" -> 1, "b" -> 2, "c" -> 3)

myMap.foreach {
    
     case (key, value) =>
  println(s"Key: $key, Value: $value")
}
  1. 使用 for 循环遍历 Map 中的键值对:
val myMap: Map[String, Int] = Map("a" -> 1, "b" -> 2, "c" -> 3)

for ((key, value) <- myMap) {
    
    
  println(s"Key: $key, Value: $value")
}
  1. 使用 keySet 方法遍历 Map 的键,然后根据键获取对应的值:
val myMap: Map[String, Int] = Map("a" -> 1, "b" -> 2, "c" -> 3)

for (key <- myMap.keySet) {
    
    
  val value = myMap(key)
  println(s"Key: $key, Value: $value")
}
  1. 使用 values 方法遍历 Map 的值:
val myMap: Map[String, Int] = Map("a" -> 1, "b" -> 2, "c" -> 3)

for (value <- myMap.values) {
    
    
  println(s"Value: $value")
}
  1. 使用 map 方法将 Map 转换为另一个集合类型(如 List)进行遍历:
val myMap: Map[String, Int] = Map("a" -> 1, "b" -> 2, "c" -> 3)

val keyValueList: List[(String, Int)] = myMap.toList

for ((key, value) <- keyValueList) {
    
    
  println(s"Key: $key, Value: $value")
}

以上是几种常见的遍历 Map 的方式。根据不同的需求,您可以选择合适的遍历方式来处理 Map 中的键值对。在遍历过程中,可以根据具体的业务逻辑进行相应的操作。

四、Scala中的Map和Java中的Map

Scala 中的 Map 和 Java 中的 Map 都是用于存储键值对的集合,但在语言实现和使用方式上有一些不同之处。

  1. 实现方式:

    • Java 中的 Map 是 Java 标准库的一部分,使用 java.util.Map 接口来定义,有多个具体的实现类,如 HashMapTreeMapLinkedHashMap 等。Java 中的 Map 是可变的,并且在使用时需要使用相应的实现类来创建具体的 Map 实例。
    • Scala 中的 Map 是 Scala 标准库的一部分,使用 scala.collection.immutable.Mapscala.collection.mutable.Map 来定义,分别表示不可变 Map 和可变 Map。Scala 中的 Map 默认是不可变的,如果需要使用可变 Map,可以导入 scala.collection.mutable 包。
  2. 可变性:

    • Java 中的 Map 默认是可变的,可以通过调用不同的实现类来选择不同的可变性。
    • Scala 中的 Map 默认是不可变的,如果需要可变 Map,需要显式地导入 scala.collection.mutable 包,并使用 scala.collection.mutable.Map 来定义可变 Map。
  3. 修改操作:

    • Java 中的 Map 提供了一系列修改操作方法,可以添加、删除和更新键值对。常见的修改方法有 putremoveputAll 等。
    • Scala 中的不可变 Map 是不可修改的,一旦创建后,不能更改其内容。如果需要添加、删除或更新元素,会返回一个新的 Map。而可变 Map 可以直接在原地修改内容。
  4. 创建方式:

    • Java 中创建 Map 需要使用具体的实现类来创建实例,例如 HashMapTreeMap 等。
    • Scala 中创建 Map 可以使用 Map 的伴生对象的工厂方法,或直接使用 Map 字面量来创建。

示例创建 Map:

Java 中创建 HashMap:

import java.util.HashMap;
import java.util.Map;

Map<String, Integer> javaMap = new HashMap<>();
javaMap.put("a", 1);
javaMap.put("b", 2);
javaMap.put("c", 3);

Scala 中创建不可变 Map:

val scalaImmutableMap: Map[String, Int] = Map("a" -> 1, "b" -> 2, "c" -> 3)

Scala 中创建可变 Map:

import scala.collection.mutable.Map

val scalaMutableMap: Map[String, Int] = Map("a" -> 1, "b" -> 2, "c" -> 3)

总结:Scala 中的 Map 和 Java 中的 Map 都是键值对的集合,用于存储一组相关联的元素。Scala 中的 Map 默认是不可变的,使用 scala.collection.immutable.Map,可以通过导入 scala.collection.mutable 包来使用可变 Map。在使用时,可以根据需求和习惯选择合适的 Map 类型。对于不需要修改的场景,建议使用不可变 Map,因为它具有更好的线程安全性和函数式编程特性。

猜你喜欢

转载自blog.csdn.net/m0_47256162/article/details/132159826