2017-02-03 68 views
3

在我正在進行的一個項目中,我經常發現自己在做下面的模式。斯卡拉groupBy + mapValues +映射回初始格式。有沒有更好的方法

給定一個案例類別X(a:A,b:B,c:C,d:Int),以及這樣的X的列表x:列表[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)) 

我的問題,是有沒有更好/更清晰/更地道與任一階標準庫或Scalaz(這樣做的方式。如果d是任意類型的也許是Monoid實例)?

+0

你可以發佈示例列表和示例輸出嗎?我不確定你想在這裏做什麼? –

+0

稍後會做一下 –

+0

你可能想看看這個scalaz的例子:http://stackoverflow.com/questions/7142514/in-scala-how-can-i-do-the-equivalent-of-an-sql -sum-and-group-by#answer-7168846 –

回答

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)} 

如果你可以用和與你的類將是更短,更清潔,但減少或者是沒有那麼糟糕。