【问题标题】:Scala- read values from a map based on keysScala-根据键从映射中读取值
【发布时间】:2018-03-19 07:17:33
【问题描述】:

如果地图中有更多键,有没有更好的方法根据键从地图中读取值?

目前我有一个 Map[String, List[String]],它可以有超过 20 个键

我在下面使用来检索每个键的值

val names= map.getOrElse("Name", List.empty)
.
.
.
val cities = map.getOrElse("City", List.Empty)

如果我能写得更好,请帮忙。

【问题讨论】:

  • 如果数据已经存在于您的Map 并且易于访问(例如map.getOrElse(...)),为什么要填充 20 多个单独的变量(namescities 等) ?复制所有数据的目的是什么?
  • 我需要在很多地方使用它,我不想总是写 map.getOrElse(...) 所以存储在一个变量中。请建议,我是 scala 的新手

标签: scala


【解决方案1】:

我非常怀疑您将 Map 数据复制到局部变量中是否对自己有任何好处。

您可以做的一件事是使用模式匹配来节省一些(不多)输入。

val knownKeys = List("Name", "City", "Country") // etc. etc.

val List(names
        ,cities
        ,countries
        // etc. etc.
        ) = knownKeys.map(data.getOrElse(_, List()))

这个想法的一个主要缺点是键列表的顺序必须与提取中变量的顺序完全相同。

一个更好的主意是给你的Map它自己的默认值。

val data = Map("City" -> List("NY","Rome")
              ,"Name" -> List("Ed","Al")
              // etc. etc.
              ).withDefaultValue(List.empty[String])

那么你不需要.getOrElse()

data("City")     // res0: List[String] = List(NY, Rome)
data("Airport")  // res1: List[String] = List()

【讨论】:

    猜你喜欢
    • 2018-08-21
    • 2018-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-04
    • 2021-02-03
    • 2017-04-27
    • 2012-02-26
    相关资源
    最近更新 更多