Scala groupBy + mapValues + map返回初始格式。有没有更好的办法

时间:2017-02-03 11:15:41

标签: scala

在我正在进行的项目中,我经常发现自己在做以下模式。

给定一个案例类X(a:A,b:B,c:C,d:Int),以及这样的X&x; xs:List [X]的列表, 我想做数据库相当于a,b,c的分组,同时用d求和,返回类型为List [X]。

我通常最终会做的是

xs.groupBy{case X(a,b,c,d) => (a,b,c)).mapValues(_.sum).map(((a,b,c),d)) => X(a,b,c,d))

我的问题是,使用scala标准库还是Scalaz(如果d是带有Monoid实例的任意类型),是否有更好/更清晰/更惯用的方法?

1 个答案:

答案 0 :(得分:0)

我想我知道你想要实现的目标,我找到了一个更短的方法来实现这一点,你不必使用mapValues,然后映射,而是你可以用一个地图做任何事情,如下所示:

case class X(a: String, b: String, c: String, d: Int){
  def +(that: X) = X(a,b,c, d+that.d)
}

val list = List(X("1","2","3",4),X("1","2","3",5),X("11","22","33",6),X("11","22","33",9))

list.groupBy{
  case X(a,b,c,d) => (a,b,c)}.map{ case (k,v) => X(k._1, k._2, k._3, v.reduce(_ + _).d)}

如果你可以和你的班级一起使用,它会更短更清洁,但减少也不是那么糟糕。