加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

如何在Scala中调用一个方法n次?

发布时间:2020-12-16 09:34:22 所属栏目:安全 来源:网络整理
导读:我有一个我想调用一个方法n次的情况,其中n是一个Int。在Scala中以“功能”的方式有一个很好的方法吗? case class Event(name: String,quantity: Int,value: Option[BigDecimal])// a list of eventsval lst = List( Event("supply",3,Some(new java.math.B
我有一个我想调用一个方法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",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循环,但它不是一个美丽的功能解决方案。

解决方法

一个更有功能的解决方案是使用不可变队列和队列的填充和删除方法的折叠:

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

或者更好的是,在事件的子类中捕获您的“供应”/“销售”区别,并避免尴尬的选项[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)
}}

这不直接回答你的问题(如何调用函数指定的次数),但这绝对比较惯用。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读