scala模式匹配 - 绑定case类中的单个属性

时间:2015-06-23 07:36:39

标签: scala

我有一个包含很长属性列表的案例类,例如:

case class Item(itemCode: ID,
                itemType: String,
                itemName: String,
                manufacturerName: String,
                manufactureCountry: String,
                manufacturerItemDescription: String,
                unitQty: String,
                quantity: Double,
                bIsWeighted: Int,
                unitOfMeasure: String,
                qtyInPackage: Int,
                itemPrice: Double,
                unitOfMeasurePrice: Double,
                allowDiscount: Short) extends Product

我想使用模式匹配从此列表中仅提取单个属性。我可以这样做:

{
 case Item(_, _, _, _, _, _, _, _, _, _, _, price, _, _) => price
 case _ => 0.0
}

如果没有编写这个繁琐的占位符列表,有更直接的方法吗?

2 个答案:

答案 0 :(得分:4)

是的,您可以将自己的'unapply'方法添加到Item配对对象。

object Item {
  def unapply(item: Item): Option[Double] = Some(item.itemPrice)
}

Neophyte's Guide有关于提取器的良好信息。

然后你可以使用这个单一的参数模式匹配来提取价格。

item match {
  case Item(price) => ???
} 

答案 1 :(得分:3)

这里简单的解决方案是按类型匹配,而不是使用提取器:

item match {
  case i: Item => i.itemPrice
  case _ => 0.0
}

如果您的案例类有这么多字段,那么无论如何这种方式更保守,因为您可以保证每次更改类时都不必修补所有模式(添加/删除/重新排序属性)。

了解自定义提取器很高兴,但我认为这并不重要。你会为每个领域定义一个吗?

当然,我假设你首先需要模式匹配。换句话说,如果上面的item值尚未具有类型Item,则这是有意义的。否则,此模式匹配只能直接执行item.itemPrice