在应用程序的几个不同位置,我需要输入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]
到EnhancedSalesRowSeq
的隐式转换,该转换具有byCountry
实例方法。这对我很有吸引力,因为该操作适用于任何序列的SalesRows。
这是一个好主意吗?
将逻辑添加到伴随对象是我的最佳选择,还是有更好的选择?
谢谢。
最佳答案
如果您不知道该库带有 groupBy
函数。基本上给定一个Seq[SalesRow]
,它将根据从Map[T, Seq[SalesRow]]
到SalesRow
的函数提供一个T
。
因此,如果您的功能很简单,则可以轻松获取地图。我确实喜欢您关于增强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/