如何从 Option Scala 中的 Map 中删除键

How to delete key from Map in Option Scala

假设我有这样的案例 类。

case class someClass0(content: someClass1)

case class someClass1(someContent: Option[Map[String, someClass2]])

case class someClass2(someKey: Array[Int])

我需要按值删除 Map(不可变)中的项目。

这个值是我通过迭代得到的。

  val keys_to_remove = new ListBuffer[String]()
  val keys_to_keep: List[Int] = List(100, 200)
  for (x <- keys_to_keep) {
    content.someContent.get.foreach {
      case (key: String, value: someClass2) => {
        if (!value.someKey.contains(x)) {
          keys_to_remove.append(key)
        }
      }
    }
  }

那么,如何保留所有的结构,并且只删除需要的项呢?

我正在尝试更改地图类型,例如

content.someContent.map(_.to(collection.mutable.Map))

但是 content.someContent.get.remove(key) 不工作。 我做错了什么?

您可以使用 - 运算符和键上的 foldLeft 来删除。

您正在使用 get 获取价值,如果您想要安全地进行操作,您需要使用:

content.someContent.map(immutableMap => 
  keys_to_remove.foldLeft(immutableMap){
    (map, key) =>
      map - key
}).getOrElse(Map.empty[String, SomeClass2])

这就像在这个例子中一样工作:

import scala.collection.mutable.ListBuffer
val immutableMap = Map("a" -> 1, "b" -> 2, "c" -> 3, "d" -> 4)
val keys_to_remove: ListBuffer[String] = ListBuffer("b", "d")
println(immutableMap) // Map(a -> 1, b -> 2, c -> 3, d -> 4)
val mapWithoutKeys = keys_to_remove.foldLeft(immutableMap){
  (map, key) =>
    map - key
}
println(mapWithoutKeys) //Map(a -> 1, c -> 3)

你不需要可变性。

val keys_to_keep: List[String] = List("a", "b")

val res = content.someContent.map(
  _.filterKeys(k => !keys_to_keep.contains(k))
)

filterKeys 通过根据条件测试每个条目的键来过滤 Map


当然,重要的是要记住,您不能在 List[Int] 上针对 Strings 测试 contains,因为结果总是错误的。


此外,尝试查找 Scala 的风格指南:

  • 类通常以大驼峰命名
  • 值和变量通常以小驼峰命名

Try it out

你可以这样做:

val optionalMap = someClass0.content.someContent.map {
  contentMap => contentMap - keyToBeRemoved
}

val originalStructure = someClass0.copy(content = SomeClass1(optionalMap))

这是Scastie

这将删除所有键并保留结构

val someClass0_copy = someClass0.copy(content = Content(someContent = someClass0.content. someContent.map(_.removedAll(keysToRemove)))