在应用程序的几个不同位置,我需要输入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/

10-09 05:47