Вы можете использовать комбинацию groupBy
(группирует элементы по дате и книге) и reduce
для накопления сгруппированных значений:
// val list = List(
// MyClass(Date(2019, 7, 8), "book1", 100, 120),
// MyClass(Date(2019, 7, 8), "book1", 200, 220),
// MyClass(Date(2019, 7, 8), "book2", 50, 60),
// MyClass(Date(2019, 7, 8), "book2", 60, 70)
// )
list
.groupBy { case MyClass(date, book, _, _) => (date, book) }
.mapValues { values =>
values
.map { case MyClass(_, _, priceLocal, priceConv) => (priceLocal, priceConv) }
.reduce((x, y) => (x._1 + y._1, x._2 + y._2))
}
.map { case ((date, book), (priceLocal, priceConv)) =>
(date, book, priceLocal, priceConv)
}
// List(
// (Date(2019, 7, 8), "book1", 300, 340),
// (Date(2019, 7, 8), "book2", 110, 130)
// )
Это:
группирует символы по дате и книге (groupBy
)
отображает каждое сгруппированное значение (mapValues
) по:
- отображение значений как кортежа цен
- и сокращение этих кортежей путем суммирования части по части
отображает карту кортежа (дата, книга) на кортеж (цена, цена) на кортеж из 4 элементов