簡體   English   中英

在 Scala 中刪除 mutable.Map 的 foreach 循環中的條目是否安全?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM