Более функциональным решением было бы использование сгиба с неизменяемой очередью и Queue
х fill
и drop
методов:
val queue = lst.foldLeft(Queue.empty[Option[BigDecimal]]) { (q, e) =>
e.name match {
case "supply" => q ++ Queue.fill(e.quantity)(e.value)
case "sale" => q.drop(e.quantity)
}
}
Или даже лучше, захватить ваш "supply"
/ "sale"
различие в подклассах Event
и избежание неловкого Option[BigDecimal]
бизнеса:
sealed trait Event { def quantity: Int }
case class Supply(quantity: Int, value: BigDecimal) extends Event
case class Sale(quantity: Int) extends Event
val lst = List(
Supply(3, BigDecimal("39.00")),
Sale(1),
Supply(1, BigDecimal("41.00"))
)
val queue = lst.foldLeft(Queue.empty[BigDecimal]) { (q, e) => e match {
case Sale(quantity) => q.drop(quantity)
case Supply(quantity, value) => q ++ Queue.fill(quantity)(value)
}}
Это не дает прямого ответа на ваш вопрос (как вызывать функцию указанное количество раз),но это определенно более идиоматично.