Kotlin 如何按一个成员分组、汇总并映射到新对象的列表?

Kotlin 如何按一个成员分组、汇总并映射到新对象的列表?,kotlin,Kotlin,我有这样一个对象列表: val obj1 = Obj(date = LocalDate.parse("2018-12-12"), amount = BigDecimal(100)) val obj2 = Obj(date = LocalDate.parse("2018-12-12"), amount = BigDecimal(200)) val obj3 = Obj(date = LocalDate.parse("2019-10-10"), amount = BigDecimal(500))

我有这样一个对象列表:

val obj1 = Obj(date = LocalDate.parse("2018-12-12"), amount = BigDecimal(100))
val obj2 = Obj(date = LocalDate.parse("2018-12-12"), amount = BigDecimal(200))
val obj3 = Obj(date = LocalDate.parse("2019-10-10"), amount = BigDecimal(500))

val arrayOfObj = arrayOf(obj1, obj2, obj3)
date=2018-12-12, amount=300, objs=[Obj(date=2018-12-12, amount=100), Obj(date=2018-12-12, amount=200)]
date=2019-10-10, amount=500, objs=[Obj(date=2019-10-10, amount=500)]
我想返回如下所示的对象列表:

val obj1 = Obj(date = LocalDate.parse("2018-12-12"), amount = BigDecimal(100))
val obj2 = Obj(date = LocalDate.parse("2018-12-12"), amount = BigDecimal(200))
val obj3 = Obj(date = LocalDate.parse("2019-10-10"), amount = BigDecimal(500))

val arrayOfObj = arrayOf(obj1, obj2, obj3)
date=2018-12-12, amount=300, objs=[Obj(date=2018-12-12, amount=100), Obj(date=2018-12-12, amount=200)]
date=2019-10-10, amount=500, objs=[Obj(date=2019-10-10, amount=500)]
基本上,我希望按日期分组,汇总金额,并映射到一个新对象,其中包括原始对象的列表


arrayOfObj.groupBy{it.date}给了我一个很好的地图,我可以循环条目并获得数量,但我想知道是否有一种巧妙的方法可以使用fold或aggregate来实现这一点。我有点像Kotlin n00b。

正如你想象的那样,有一种方法可以使用
fold
来计算每组的总量,因为
sumBy
对于
BigDecimal
是不存在的:

arrayOfObj.groupBy{it.date}.map{(date,objs)->
//求此组中对象的总数。
val totalAmount=objs.fold(BigDecimal.ZERO){acc,obj->acc+obj.amount}
//我在这里使用了Kotlin三元组,但您可以使用自定义类。
三重(日期、总额、objs)
}

正如您所想象的,有一种方法可以使用
fold
来计算每组的总量,因为
sumBy
对于
BigDecimal
不存在:

arrayOfObj.groupBy{it.date}.map{(date,objs)->
//求此组中对象的总数。
val totalAmount=objs.fold(BigDecimal.ZERO){acc,obj->acc+obj.amount}
//我在这里使用了Kotlin三元组,但您可以使用自定义类。
三重(日期、总额、objs)
}

美丽而简单。谢谢您的快速回复@SomaiahKumbera没问题!就个人而言,我会为
BigDecimal
上的
sumBy
设计一个单行扩展函数;它将使其余的内容更具可读性,并且可以重复使用。既美观又简单。谢谢您的快速回复@SomaiahKumbera没问题!就个人而言,我会为
BigDecimal
上的
sumBy
设计一个单行扩展函数;它将使其余部分更具可读性,并且可以重用。