【问题标题】:Convert Scala Array[Object] to Map将 Scala Array[Object] 转换为 Map
【发布时间】:2019-03-04 12:54:15
【问题描述】:

我有一个包含对象的数组 (Array[Organisation])。 Organisation 对象包含一个 long orgId 和一个 string orgName。

有没有一种方便的方法可以将其转换为Map[Long, String] (orgId, orgName)

case class OrgRegistryConfig() {

  var organisations: Array[Organisation] = _

  def toMap() : Map[Long, String] = // How??
  // Output: Map( orgId as Long -> orgName as String )

}

object OrgRegistryConfig {
  case class Organisation() {
    var orgId: Long = _
    var orgName: String = _
  }
}

【问题讨论】:

    标签: scala


    【解决方案1】:

    organisations.map { o => o.orgId -> o.orgName }.toMap

    ^^ 应该这样做。

    在相关说明中,请勿使用var,除非您确定必须使用它的确切原因(在 Scala 中,95% 的情况下您不需要它,并且最好只是假装该关键字不存在,直到您对语言有足够的掌握来区分那些罕见的情况),并且绝对不在案例类中。

    另外,不要在构造函数之外声明 case 类成员。并且不要创建没有参数的案例类。

    case class OrgRegistryConfig(organizations: Array[Organization]) {
      def toMap = organizations.map { o => o.orgId -> o.orgName }.toMap
    }
    

    【讨论】:

    • 您好,谢谢!我正在使用 Spring Boot ConfigurationProperties,因此我必须复制一些 Java 行为才能使其工作。 stackoverflow.com/a/54982686/2291510
    • 是的......不要使用它。
    • 据我所知,我不能这样做。这是一个用 Scala 和 Spring Boot 编写的大型应用程序。该列表需要在正在运行的云解决方案中更新,而无需重新部署应用程序。我不能把它放在数据库中。将它放在 configmap 中就可以了:)
    【解决方案2】:

    这可能是最有效的解决方案:

    def toMap: Map[Long, String] =
      organisations.map(o => o.orgId -> o.orgName)(collection.breakOut)
    

    使用breakOut 意味着Map 将直接从Array 创建。如果您使用toMap,那么它将创建一个中间数组,然后将其转换为Map

    【讨论】:

      猜你喜欢
      • 2023-02-02
      • 1970-01-01
      • 2019-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多