[英]Is it safe to remove an entry within the foreach loop of a mutable.Map in Scala?
我知道在遍歷 C++ 或 Java 等多種語言的集合時刪除條目時我們應該謹慎,但不確定 Scala 是否有任何區別。
那么下面的代碼片段安全嗎?
val mutableMap: [String, List[String]] = ...
mutableMap.foreach { case (k, list) =>
// do sth. to list
if (list.isEmtpy) mutableMap -= k
}
如果我想更新(k -> v)
映射的值,推薦的方法是什么?
val mutableMap: [String, List[String]] = ...
mutableMap.foreach { case (k, list) =>
mutableMap += (k, anotherList) // is this safe?
}
謝謝!
我想您可以使用如下所示的不可變地圖實現相同的目標;
val map: Map[String, List[Int]] = Map(
"apple" -> List(),
"orange" -> List(1),
"banana" -> List(1, 2),
"pineapple" -> List(1, 2, 3),
"kiwi" -> List(1, 2, 3, 4)
)
def doSomething(list: List[Int]) = ()
map.foldLeft(map) {
case (acc, (key, value)) =>
doSomething(value)
if (value.isEmpty) acc - key else acc
}
但我希望doSomething
方法可能正在做一些可以算作副作用的事情。 如果您負擔得起使用貓庫,我建議您按照以下方式進行操作;
import cats.effect.IO
import cats.implicits._
def doSomething(list: List[Int]): IO[Option[List[Int]]] = IO.pure(Some(list).filter(_.nonEmpty))
val program = map.toList
.traverseFilter { case (key, value) => doSomething(value).map(_.map(key -> _))}
.map(_.toMap)
program.unsafeRunSync()
您應該考慮使用內置方法filterInPlace在處理時刪除條目。
val mutableMap: [String, List[String]] = ...
mutableMap.filterInPlace((k, list) => (list.nonEmpty))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.