我有一个包含很长属性列表的案例类,例如:
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
}
如果没有编写这个繁琐的占位符列表,有更直接的方法吗?
答案 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