gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 06:04:05 24 4
gpt4 key购买 nike

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

给定一个案例类 X(a: A, b: B, c:C, d: Int),以及这样一个 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 实例的任意类型)?

最佳答案

我想我知道你想要实现什么,我找到了一种更短的方法来实现这一点,你不必使用 mapValues,然后映射,相反,你可以用一张 map 完成所有事情,如下所示:

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

如果你可以在你的类中使用 sum ,它会更短更干净,但 reduce 也不是那么糟糕。

关于Scala groupBy + mapValues + 映射回初始格式。有没有更好的办法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42022936/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com