Функциональное вычисление списочных значений - PullRequest
4 голосов
/ 14 февраля 2012

У меня есть 2 списка, содержащих экземпляры лотерейных билетов.

Один список содержит билеты, выигравшие специальный приз, другой список содержит билеты, получившие финальные цифры.

Теперь я должен исключить эти билеты с избыточными номерами и сложить призы вместе.

case class Ticket(number:Long, prize:Long)

val specialPrizes    = List(Ticket(42, 1000), Ticket(66, 2000))
val finalDigitPrizes = List(Ticket(42, 50))

Это приведет к созданию списка с объединенными билетами, в которых будут собраны призы:

val finalList = List(Ticket(42, 1050), Ticket(66, 2000))

Каков наиболее эффективный способ сделать это функционально без временных переменных, счетчиков индексов и т. Д.?

1 Ответ

9 голосов
/ 14 февраля 2012
scala> (specialPrizes ++ finalDigitPrizes).groupBy(_.number).map {
     |   case (n, ts) => Ticket(n, ts.map(_.prize).sum)
     | }
res1: scala.collection.immutable.Iterable[Ticket] = List(Ticket(42,1050), Ticket(66,2000))
...