Используйте immutable.ListMap вместо mutable.LinkedHashMap - PullRequest
2 голосов
/ 25 апреля 2019

Я хочу максимально использовать неизменяемую структуру данных.Очень общим случаем в нашей кодовой базе является использование mutable.LinkedHashMap .Я хочу заменить это на immutable.ListMap во всем не критичном для производительности коде.

Общий формат, который наш код имеет как

  1. mutable.LinkedHashMap initialization
  2. условие цикла
  3. на основе некоторого условия добавить элемент в LinkedHashMap
  4. После цикла вернуть LinkedHashMap

Пример кода:

def dummyFunction(): mutable.LinkedHashMap[Int, String] = {
    val tmpListMap: mutable.LinkedHashMap[Int, String] = mutable.LinkedHashMap()
    for (i <- 1 to 10) {
        if (i%2 ==0) tmpListMap += (i -> "even")
        else tmpListMap += (i -> "odd")
    }
    tmpListMap
}

Я хочу использовать ListMap во всех таких местах.Я не хочу повторять цикл tmpListMap для создания ListMap.

Версия Scala: 2.11

1 Ответ

4 голосов
/ 25 апреля 2019

Вы не знаете, как вернуть неизменяемую карту, потому что вы не можете изменить ее после ее создания? Это вопрос? Много способов. Например:

(1 to 10).map { 
    case x if x%2 == 0 => (x -> "even")
    case x => (x -> "odd")
 }.toMap

Выше возвращается обычный Map, а не ListMap. Я не уверен, почему вы хотите последнее, но, если вы по какой-то причине, это немного больше вовлечено:

 val tuples = (1 to 10).map { 
    case x if x%2 == 0 => (x -> "even")
    case x => (x -> "odd")
 }
 ListMap(tuples:_*)

Да, вы также можете отказаться от понимания (я не уверен, почему вы хотели бы в этом случае), например:

val tuples = for {
  x <- 1 to 10 
  kind = if (x %2 == 0) "even" else "odd"
} yield (x -> kind) 

Это делает то же самое, что и map вызов выше.

Вы также можете начать с ListMap, чтобы избежать преобразования в конце:

 ListMap((1 to 10).map(_ -> ""):_*).map { 
   case (k, _) if k%2 == 0 => k -> "even"
   case (k, _) => k -> "odd"
 }

Или просто:

 ListMap(
    (1 to 10).map {
       case x if x%2 == 0 => x -> "even"
       case x => x -> "odd"
     }:_*
 )

Существует также .foldLeft, который позволяет вам записать его таким образом, который больше всего напоминает то, что у вас есть в настоящее время, в том смысле, что он постепенно накапливает изменения на карте, а не выполняет одно преобразование в конце ... не знаю, почему вы этого хотите, хотя это наименее эффективный способ:

 (1 to 10).foldLeft(ListMap.empty[Int, String]) { 
    case (x, map) if x%2 == 0 => map.updated(x, "even")
    case (x, map) => map.updated(x, "odd")
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...