如何替换Scala中的多个存在项?

如何替换Scala中的多个存在项?,scala,Scala,我有一段代码,它根据所选类别中某个项目的存在来确定服务费用: def bill(purchasedItems: List[String]): BigDecimal = { def totalCost: BigDecimal = purchasedItems.foldLeft(BigDecimal(0))((tot, p) => tot + menu(p).price) def serviceChargeRate: BigDecimal = if (purchasedIte

我有一段代码,它根据所选类别中某个项目的存在来确定服务费用:

def bill(purchasedItems: List[String]): BigDecimal = {
    def totalCost: BigDecimal = purchasedItems.foldLeft(BigDecimal(0))((tot, p) => tot + menu(p).price)

    def serviceChargeRate: BigDecimal = if (purchasedItems.exists(name => menu(name).serviceChargeCategory == PremiumItem)) 1.2
    else if (purchasedItems.exists(name => menu(name).serviceChargeCategory == Food)) 1.1
    else 1.0

    totalCost * serviceChargeRate
  }
我尝试用collectFirst替换此项,但它将匹配第一项,而不是使用优先级顺序,以确保使用最高的服务费

 def bill(purchasedItems: List[String]): BigDecimal = {
    def totalCost: BigDecimal = purchasedItems.foldLeft(BigDecimal(0))((tot, p) => tot + menu(p).price)

    def serviceChargeRate: Option[BigDecimal] = purchasedItems.map(menu(_).serviceChargeCategory) collectFirst {
      case PremiumItem => BigDecimal("1.2")
      case Food => BigDecimal("1.1")
    }

    totalCost * serviceChargeRate.getOrElse(BigDecimal("1.0"))
  }
在Scala中是否有更好、更实用的方法来实现这一点,或者我是否必须接受if/else块

谢谢


我的建议大致如下:

def bill(purchasedItems: List[String]): BigDecimal = {
  val  totalCost: BigDecimal = purchasedItems.foldLeft(BigDecimal(0))((tot, p) => tot + menu(p).price)
  val serviceRate: BigDecimal = purchasedItems.map { item ⇒ menu(item).serviceChargeCategory match {
    case "PremiumItem" ⇒ 1.2
    case "Food" ⇒ 1.1
    case _ ⇒ 1.0
}}.max

  totalCost * serviceChargeRate
}

我的建议大致如下:

def bill(purchasedItems: List[String]): BigDecimal = {
  val  totalCost: BigDecimal = purchasedItems.foldLeft(BigDecimal(0))((tot, p) => tot + menu(p).price)
  val serviceRate: BigDecimal = purchasedItems.map { item ⇒ menu(item).serviceChargeCategory match {
    case "PremiumItem" ⇒ 1.2
    case "Food" ⇒ 1.1
    case _ ⇒ 1.0
}}.max

  totalCost * serviceChargeRate
}

看起来不错。如果你想住在英国约克郡,我们正在招聘:-)看起来不错。如果你想住在英国约克郡,我们正在招聘:-)