【问题标题】:How to group by, sum up by one member and map to a list of a new object?如何分组,按一个成员总结并映射到新对象的列表?
【发布时间】:2020-03-22 03:14:46
【问题描述】:

我有一个这样的对象列表:

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} 给了我一张漂亮的地图,我可以循环输入并获取金额,但我想知道是否有一种巧妙的方法可以通过折叠或聚合来做到这一点。我有点像 Kotlin n00b。

【问题讨论】:

    标签: kotlin


    【解决方案1】:

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

    arrayOfObj.groupBy { it.date }.map { (date, objs) ->
        // Sums the amount of the objects of this group.
        val totalAmount = objs.fold(BigDecimal.ZERO) { acc, obj -> acc + obj.amount }
        // I've used a Kotlin Triple here but you can use your custom class.
        Triple(date, totalAmount, objs)
    }
    

    【讨论】:

    • 美丽而简单。感谢您的快速回复
    • @SomaiahKumbera 没问题!
    • 就个人而言,我会在BigDecimal 上为sumBy 考虑一个单行扩展功能;它会使其余部分更具可读性,并且也可以重用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-06
    • 2019-02-19
    • 1970-01-01
    相关资源
    最近更新 更多