Полагаю, вы можете добиться того же с неизменяемой картой, как показано ниже;
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()