Как сгруппировать, суммировать по одному члену и сопоставить со списком нового объекта? - PullRequest
0 голосов
/ 21 марта 2020

У меня есть список объектов, подобных этому:

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

В основном я хотел бы groupBy date, суммируйте суммы и сопоставьте с новым объектом, который включает в себя список оригинальных объектов

arrayOfObj.groupBy {it.date} дает мне хорошую карту, и я могу l oop записи и получить сумму, но мне интересно, если есть хитрый способ сделать это с фолдом или агрегацией. Я немного о Kotlin n00b.

1 Ответ

2 голосов
/ 21 марта 2020

Как вы и предполагали, есть способ использовать 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)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...