Scala: цикл for с getOrElse не работает? - PullRequest
0 голосов
/ 05 июня 2018

Я хочу найти значения в списке ключей на карте.Если карта не содержит ключа, она должна вернуть пустой список.

val keys = List("a", "b", "c")
val kv = Map("a" -> List(0,1), "b" -> List(1))

val result: List[List[Int]] = List( List(0,1), List(1), List())

Мой подход был следующим:

val result = for (key <- keys; value <- kv.getOrElse(key, List.empty[Int])) yield value

Но это просто возвращает result : List[Int] = List(0, 1, 1)

И kv.filterKeys(word => keys.contains(word)).values.toList тоже не возвращает пустой список (очевидно)

Так что мой вопрос: почему функция getOrElse не работает должным образом иликак я могу сделать это лучше?

Ответы [ 2 ]

0 голосов
/ 05 июня 2018

Если вы хотите использовать for-yield, просто измените генератор value на присвоение:

for (key <- keys; value = kv.getOrElse(key, List.empty[Int])) yield value

, что эквивалентно:

for (key <- keys) yield kv.getOrElse(key, List.empty[Int])

Для болееподробности о for-yield, вот Scala doc .

0 голосов
/ 05 июня 2018

Вы делаете эквивалент flatMap, поэтому возвращается пустой список, он просто выравнивается.Вы хотите просто использовать map:

keys map {kv.getOrElse(_, List())}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...