如何在选项Scala中从映射中删除密钥

如何在选项Scala中从映射中删除密钥,scala,scala-collections,Scala,Scala Collections,假设我有这样的案例课程 case class someClass0(content: someClass1) case class someClass1(someContent: Option[Map[String, someClass2]]) case class someClass2(someKey: Array[Int]) 我需要按值删除映射中的项(不可变) 这个值是我通过迭代得到的 val keys_to_remove = new ListBuffer[String]()

假设我有这样的案例课程

case class someClass0(content: someClass1)

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

case class someClass2(someKey: Array[Int])
我需要按值删除映射中的项(不可变)

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

  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.get.remove(key)
不起作用。
我做错了什么?

您可以使用
-
操作符和折叠键来删除

您正在使用
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


当然,重要的是要记住,您不能针对
字符串测试
列表[Int]
上的
包含的
,因为结果总是错误的


此外,请尝试查找Scala的样式指南:

  • 类通常以大写字母命名
  • 值和变量通常以小写字母命名

以下是您的操作方法:

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

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

以下是

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

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

但我不仅有Map,还有Option[Map]。我尝试了
val-mapWithoutKeys=keys\u-to\u-remove.foldLeft(content.someContent.get)
和get-just
HashMap()
我得到了一些(MapView())(@MakarNikitin这意味着你的
Map
正在使用
MapView
实现。这是一个懒惰的实现,在你真正查询它们之前不会产生结果(例如,使用
.apply(key)
)。我不仅需要筛选的映射,还需要所有父结构。@MakarNikitin我已经更新了我的答案以及到Scastie的链接。
val someClass0_copy = someClass0.copy(content = Content(someContent = someClass0.content. someContent.map(_.removedAll(keysToRemove)))