我有几个带有count
字段的案例类。默认情况下为1,并且我的代码中有一个reduce函数,将重复项分组并将该值求和以找到每个对象的数量。例如:
case class Person(name: String, count = 1)
personList.groupBy(_.name).reduce((x,y) => x.copy(count = x.count + 1))
我在多个案例类中都有这个逻辑,由于我的逻辑比上面的示例要复杂一些,因此我想创建一个通用的合并函数。
因此,我创建了一个带有count
字段的sealed trait
。然后我将我的案例类更改为扩展此类,例如:
case class Person(name: String, override val count) extends Countable
目前为止一切都很好。
然而,我无法解决如何声明我的merge
函数,使其仅接受继承Countable
的case类。由于这个原因,它找不到copy
方法。
这是我拥有的:
def merge[T <: Countable](f: T => Seq[String])(ms: Seq[T]): Vector[T] =
ms.groupBy(x => f(x).mkString("_")).mapValues(_.reduce { (x,y) =>
x.copy(count = x.count + 1) // can't find `copy`
}).values.toVector
有没有一种类型类可以包含一个类型具有
copy
方法(或是一个case class)的意思,在使用Scala 2.11.7时也可以包含它?
更新:
Countable
特质是:sealed trait Countable {
def timesSeen: Long = 1
}
x.copy
,而是x.copy(count = x.count + 1)
。现在我根本无法对copy
进行参数化... - jbrown