【问题标题】:Generate Map from Objects of particular Type? [duplicate]从特定类型的对象生成地图? [复制]
【发布时间】:2016-05-08 06:12:37
【问题描述】:

我有一个相同类型的案例对象列表,例如。

object Countries {
    sealed abstract class Country (val name: String)
    case object SE extends Country("Sweden")
    case object AE extends Country("United Arab Emirates")
    case object GB extends Country("United Kingdom")
    case object US extends Country("United States of America")
}

现在我想创建一个这样的映射。

val map = Map[String, Country](

        CH.name -> CH,
        AE.name -> AE,
        GB.name -> GB,
        US.name -> US

        )

这样我就可以做到这一点。通过传递它的 String 键来获取对适当案例对象的引用。

val us = Countries.map.get("United Kingdom")

有没有办法自动生成map

【问题讨论】:

标签: scala


【解决方案1】:
object ReflectUtils {
  import scala.reflect.runtime.universe.{TypeTag, typeOf}

  def knownDirectSubclassesAsMap[T: TypeTag](keyGenerator: T => String): Map[String, T] =
    typeOf[T].typeSymbol.asClass.knownDirectSubclasses.map { c =>
      reflect.runtime.currentMirror.reflectModule(c.owner.typeSignature.member(c.name.toTermName).asModule).instance
    }.asInstanceOf[Set[T]].map(obj => keyGenerator(obj) -> obj).toMap
}

然后:

object Countries {
  sealed abstract class Country(val name: String)
  case object SE extends Country("Sweden")
  case object AE extends Country("United Arab Emirates")
  case object GB extends Country("United Kingdom")
  case object US extends Country("United States of America")

  lazy val countriesByName = ReflectUtils.knownDirectSubclassesAsMap[Country](_.name)
  def forName = countriesByName.apply _
}

e。 G。 Countries.forName("United States of America") 返回 Countries.US 对象。

【讨论】:

  • 一式两份 - 这只是运行时解决方案,对吗?
  • @JamieP 是的,它是运行时解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-12
  • 2022-01-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多