Scala 地图集合案例-class 到 Map()
Scala map collection case-class to Map()
我有 2 个案例-classes:
case class OutlierPortal(portal: String, timeData: Seq[OutlierPortalTimeSeriesData])
和
case class OutlierPortalTimeSeriesData(period: Timestamp, totalAmount: Double, isOutlier: Int)
或分别 Seq[OutlierPortal]
我想要执行的操作与 Scala Macros: Making a Map out of fields of a class in Scala 类似,但我想将(嵌套的)case-classes 的序列映射到 Seq[Map[String, Any]]
.
然而,对于 scala 的新手我有点害怕 macros 的提议想法。有没有一种 "simpler" 方法可以将这个 Seq[OutlierPortal]
的序列映射到 Seq[Map[String, Any]]
或者您会建议即使是 scala 初学者也开始使用宏吗?对我来说,单向转换(case-class -> map)就足够了。
如果您希望避免花哨的技巧,并且您没有太多 类 来写这个,您可以自己编写创建地图的方法。我建议在您的案例 类 中添加名为 toMap
的方法。如果使用 Map()
构造函数,OutlierPortalTimeSeriesData
很简单:
case class OutlierPortalTimeSeriesData(period: Timestamp, totalAmount: Double, isOutlier: Int) {
def toMap: Map[String, Any] = Map(
"period" -> period,
"totalAmount" -> totalAmount,
"isOutlier" -> isOutlier)
}
我想那里有一些重复,但至少如果您有理由更改字符串值而不是变量名称,您可以灵活地这样做。
要获取一系列可以调用 toMap
的内容,并将其转换为 Seq[Map[String, Any]]
,只需使用 map
:
mySeq.map { _.toMap }
我们可以用这两个来写OutlierPortal
的toMap
:
case class OutlierPortal(portal: String, timeData: Seq[OutlierPortalTimeSeriesData]) {
def toMap: Map[String, Any] = Map(
"portal" -> portal,
"timeData" -> timeData.map { _.toMap })
}
然后再次将 Seq[OutlierPortal]
转换为 Seq[Map[String, Any]]
。
根据您使用这些对象和方法的方式,您可能想要定义一个特征来区分 类 与此方法,并让您的案例 类 扩展它:
trait HasToMap { def toMap: Map[String, Any] }
case class Blah( /* ... */ ) extends HasToMap {
def toMap: /* ... */ }
}
这将让您获取一个您知道可以转换为 Map[String, Any]
(或它们的序列等)的值,该方法不关心它是哪种特定类型。
我有 2 个案例-classes:
case class OutlierPortal(portal: String, timeData: Seq[OutlierPortalTimeSeriesData])
和
case class OutlierPortalTimeSeriesData(period: Timestamp, totalAmount: Double, isOutlier: Int)
或分别 Seq[OutlierPortal]
我想要执行的操作与 Scala Macros: Making a Map out of fields of a class in Scala 类似,但我想将(嵌套的)case-classes 的序列映射到 Seq[Map[String, Any]]
.
然而,对于 scala 的新手我有点害怕 macros 的提议想法。有没有一种 "simpler" 方法可以将这个 Seq[OutlierPortal]
的序列映射到 Seq[Map[String, Any]]
或者您会建议即使是 scala 初学者也开始使用宏吗?对我来说,单向转换(case-class -> map)就足够了。
如果您希望避免花哨的技巧,并且您没有太多 类 来写这个,您可以自己编写创建地图的方法。我建议在您的案例 类 中添加名为 toMap
的方法。如果使用 Map()
构造函数,OutlierPortalTimeSeriesData
很简单:
case class OutlierPortalTimeSeriesData(period: Timestamp, totalAmount: Double, isOutlier: Int) {
def toMap: Map[String, Any] = Map(
"period" -> period,
"totalAmount" -> totalAmount,
"isOutlier" -> isOutlier)
}
我想那里有一些重复,但至少如果您有理由更改字符串值而不是变量名称,您可以灵活地这样做。
要获取一系列可以调用 toMap
的内容,并将其转换为 Seq[Map[String, Any]]
,只需使用 map
:
mySeq.map { _.toMap }
我们可以用这两个来写OutlierPortal
的toMap
:
case class OutlierPortal(portal: String, timeData: Seq[OutlierPortalTimeSeriesData]) {
def toMap: Map[String, Any] = Map(
"portal" -> portal,
"timeData" -> timeData.map { _.toMap })
}
然后再次将 Seq[OutlierPortal]
转换为 Seq[Map[String, Any]]
。
根据您使用这些对象和方法的方式,您可能想要定义一个特征来区分 类 与此方法,并让您的案例 类 扩展它:
trait HasToMap { def toMap: Map[String, Any] }
case class Blah( /* ... */ ) extends HasToMap {
def toMap: /* ... */ }
}
这将让您获取一个您知道可以转换为 Map[String, Any]
(或它们的序列等)的值,该方法不关心它是哪种特定类型。