在我的应用程序的几个不同地方,我需要获取一个 Seq[SalesRow]
并返回一个 Map[String,SalesRow]
,其中字符串是名称一个国家。
我需要在几个地方使用它。例如,我获取了所有 SalesRows 的列表,并按国家/地区获得了全局销售额明细。但在其他地方,我想按月再按国家/地区分割我的销售额(所以 Map[Month,Seq[SalesRow]]
变成 Map[Month,Map[String,Seq[ SalesRow]]]
) - 在其他地方,我想按天分割,然后按国家/地区分割。
我的问题是:我在哪里放置采用 Seq[SalesRow]
并将国家/地区 map 返回到行的(少量)逻辑?现在,我将它放在伴随对象方法 SalesRow.byCountry(rows : Seq[SalesReport]
中。这是最优的吗?
我想到了一个稍微疯狂的想法,即创建一个从 Seq[SalesRow]
到 EnhancedSalesRowSeq
的隐式转换,它有一个 byCountry
实例方法。这对我很有吸引力,因为该操作适用于任何序列的 SalesRow。
这是个好主意吗?
将逻辑添加到伴生对象是我的最佳选择,还是有更好的选择?
谢谢。
最佳答案
如果您不知道该库附带一个 groupBy
功能。基本上给定一个 Seq[SalesRow]
,它会根据从 SalesRow
到 T
.
因此,如果您的功能很简单,您可以轻松获得 map 。我很喜欢你关于增强 seq 以及将隐式放入 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))
}
}
关于oop - 如何处理特定类型集合的操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5843849/