我有几个带有 count
字段的案例类。默认情况下它是 1,我的代码中有一个 reduce,它对重复项进行分组并对该值求和以找到每个对象的数量。例如。:
case class Person(name: String, count = 1)
personList.groupBy(_.name).reduce((x,y) => x.copy(count = x.count + 1))
我在几个案例类中都有这个逻辑,因为我的逻辑比上面的例子复杂一些,所以我想创建一个通用的合并函数。
所以我创建了一个带有
sealed trait
字段的 count
。然后我更改了我的案例类以从这里扩展,例如:case class Person(name: String, override val count) extends Countable
到现在为止还挺好。
但是,我无法弄清楚如何声明我的
merge
函数,以便它只接受扩展 Countable
的案例类。因此,它找不到 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
是否有我也可以包含的类型类,这意味着使用 Scala 2.11.7 的类型具有
copy
方法(或者是案例类)?更新:
Countable
特性是:sealed trait Countable {
def timesSeen: Long = 1
}
最佳答案
你是如何定义你的 Countable 特质的。
以下代码段对我来说很好用:
trait Countable[Z] {
def count: Int
def copy: Z
}
case class Person(name: String, override val count: Int) extends Countable[Person] {
override def copy: Person = this
}
def merge[T <: Countable[T]](f: T => Seq[String])(ms: Seq[T]): Vector[T] = {
val r = ms.groupBy(x => f(x).mkString("_")).mapValues(_.reduce { (x, y) =>
x.copy
}).values.toVector
r
}