gpt4 book ai didi

scala - 如何在Scala中调用n次方法?

转载 作者:行者123 更新时间:2023-12-01 05:41:12 24 4
gpt4 key购买 nike

我有一种情况,我想调用一个方法n次,其中n是一个Int。在Scala中,有没有以“功能性”方式做到这一点的好方法?

case class Event(name: String, quantity: Int, value: Option[BigDecimal])

// a list of events
val lst = List(
Event("supply", 3, Some(new java.math.BigDecimal("39.00"))),
Event("sale", 1, None),
Event("supply", 1, Some(new java.math.BigDecimal("41.00")))
)

// a mutable queue
val queue = new scala.collection.mutable.Queue[BigDecimal]

lst.map { event =>
event.name match {
case "supply" => // call queue.enqueue(event.value) event.quantity times
case "sale" => // call queue.dequeue() event.quantity times
}
}


我认为关闭是解决此问题的好方法,但我无法使其正常运行。我也尝试过for循环,但这不是一个漂亮的功能性解决方案。

最佳答案

更具功能性的解决方案是使用带有不可变队列的折叠以及Queuefilldrop方法:

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


这并不能直接回答您的问题(如何多次调用一个函数),但是肯定是比较习惯的。

关于scala - 如何在Scala中调用n次方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7530194/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com