Безопасно ли удалять запись в пределах foreach l oop изменяемого файла. Карта в Scala? - PullRequest
1 голос
/ 13 февраля 2020

Я знаю, что мы должны быть осторожны при удалении записи при обходе коллекции на многих языках, таких как 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?
}

Спасибо!

1 Ответ

0 голосов
/ 14 февраля 2020

Полагаю, вы можете добиться того же с неизменяемой картой, как показано ниже;

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, вероятно, выполняет то, что считается побочным эффектом. Если вы можете позволить себе использовать библиотеку cats , я бы посоветовал вам сделать это следующим образом:

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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...