在我的申请中的几个不同地方,我需要采取Seq[SalesRow]
并返回一个Map[String,SalesRow]
,其中字符串是国家/地区的名称。
我需要在几个地方使用它。例如,我获取所有 SalesRows 的列表,并获取按国家/地区划分的全球销售明细。但在其他地方,我想按月然后按国家/地区细分我的销售额(所以Map[Month,Seq[SalesRow]]
变成Map[Month,Map[String,Seq[SalesRow]]]
) - 在其他地方,我想按天细分,然后按国家/地区细分。
我的问题是:我应该将需要的(少量)逻辑放在哪里Seq[SalesRow]
并将国家地图返回到行?现在,我将其放入伴随对象方法中,SalesRow.byCountry(rows : Seq[SalesReport]
。这是最佳的吗?
我想到了一个稍微疯狂的想法,那就是创建一个隐式转换Seq[SalesRow]
to EnhancedSalesRowSeq
,其中有一个byCountry
实例方法。这对我很有吸引力,因为该操作适用于任何 SalesRows 序列。
这是一个好主意吗?
将逻辑添加到伴生对象是我的最佳选择,还是有更好的选择?
Thanks.
如果您不知道该库带有groupBy http://www.scala-lang.org/api/current/scala/collection/TraversableLike.html#groupBy%5BK%5D%28%28A%29%20%E2%87%92%20K%29%3aMap%5BK,%20Repr%5D功能。基本上给出了Seq[SalesRow]
它会给你一个Map[T, Seq[SalesRow]]
基于函数SalesRow
to T
.
因此,如果您的功能很简单,您就可以轻松获得地图。我确实喜欢你关于增强序列与将隐含内容结合起来的想法SalesRow
伴侣:
case class SalesRow(val month:Int, val country:String,
val person:String, val amount:Float)
class EnhancedRow(rows: Seq[SalesRow]) {
def byCountry: Map[String, Seq[SalesRow]] =
rows.groupBy(_.country)
def byMonth: Map[Int, Seq[SalesRow]] =
rows.groupBy(_.month)
def byCountryByMonth: Map[String, Map[Int, Seq[SalesRow]]] = byCountry.mapValues(r => new EnhancedRow(rows).byMonth)
}
object SalesRow {
implicit def toEnhanced(rows: Seq[SalesRow]) = new EnhancedRow(rows)
}
object Test {
def main(args:Array[String] = null) {
val seq: Seq[SalesRow] = // ... fill this
println(seq.byCountry)
println(seq.byCountryByMonth)
// same as:
println(seq.byCountry.mapValues(_.byMonth))
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)