oop - 如何处理特定类型集合的操作?

标签 oop scala implicits

在我的应用程序的几个不同地方,我需要获取一个 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],它会根据从 SalesRowT.

因此,如果您的功能很简单,您可以轻松获得 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/

相关文章:

c++ - 错误 C2280。试图引用已删除的函数。尝试从数据结构中删除敌人和激光时出现此错误

c++ - 在扑克 C++ 中绘制同一张牌的问题

algorithm - 如何使用第一个 map 的值检索嵌套 map 的值?

r - S4:使用类属性作为类方法的默认输入值

c++ - 在 C++ 中包含和访问线程全局变量

java - Swagger 代码生成 : simple JAX-RS example

scala - 在 Scala 中将一个对象定义为对另外两个对象的操作

scala - 用于 Scala 中理解的单子(monad)隐式转换

scala - 含糊不清的隐含

c# - 使用 Mapper 与隐式运算符有什么优势吗?