将case类的Option转换为其元素的元组

时间:2018-05-24 23:27:48

标签: scala functional-programming

所以我有以下案例类

case class Order(itemName: Option[String], quantity: Option[Int])

我有一个变量,它是Order

的一个选项
val maybeOrder: Option[Order] = ???   // could be Some(...) or None

我想知道有更一般的方式来做以下事情吗? (这是为了使它适用于具有N个参数的案例类)

maybeOrder match {
  case Some(order) => (order.itemName, order.quantity)
  case None => (None, None)
}

对于任何案例类,需要一个很好的方法来处理以下情况:

Some(Order) => (itemNameOption, quantityOption)

None => (None, None)

1 个答案:

答案 0 :(得分:0)

你的问题的简单答案是"没有",你的代码几乎和它一样好。

Scala不提供从案例类创建元组的通用方法,您需要提取元素并从中创建元组。解析Option的其他方式(例如fold)会创建更加丑陋的代码。

我知道这只是一个例子,但你的代码确实看起来很奇怪。当前代码可以创建一个元组(None, Some(3)),这是3个nothings的订单!当然你真的想要Option[(String, Option[Int])]这是一个可选数量的项目的可选订单。

该代码只是

maybeOrder.collect{ case Order(Some(i), q) => (i, q) }