我有一个List [Tuple3 [User,Order,OrderItem]]
的查询结果要创建Invoice的案例类实例,其伴随对象将采用User,Order和List [OrderItem]。
目前我正在攻击类似的东西:
def getInvoice(orderNum: String): Option[Invoice] = {
val res =
dao.byOrderNum(orderNum) // List[ Tuple3[User, OrderEntry, OrderItem] ]
if(!res.isEmpty) {
val(user, order) = (res(0)._1, res(0)._2)
val items = res map { case(_, _, oi: OrderItem) => oi }
Some( Invoices.apply(user, order, items) ) // gets an Invoice
}
else None
}
我可以将查询结果设为List[ Option[Tuple3[User, Order, OrderItem]] ]
,这样可以让我对结果进行flatMap,但不确定是什么让我购买。
无论如何,问题必须是更简洁/更优雅的解决方案
由于
答案 0 :(得分:7)
以下内容应完全等效:
def getInvoice(orderNum: String): Option[Invoice] = {
val res = dao.byOrderNum(orderNum)
res.headOption.map {
case (user, order, _) => Invoices(user, order, res.map(_._3))
}
}
关键是headOption
,它以更惯用的方式处理空虚检查(它为空序列提供None
,为非空提供Some(xs.head)
。< / p>
答案 1 :(得分:4)
headOption
这个东西很整洁,你也可以使用它,因为它就在那里,但你可以简单地在List上进行模式匹配(而不是映射一个Option),这就是你在问题中的那种,但它只需要整理一下:
res match {
case (a, b, _) :: _ => Some(Invoices(a, b, res.map(_._3)))
case _ => None
}