scala:将List [Tuple3 [A,B,C]]转换为Foo的最短路径(A,B,List [C])

vir*_*yes 2 mapping scala list instance one-to-many

我有一个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
}
Run Code Online (Sandbox Code Playgroud)

我可以将查询结果List[ Option[Tuple3[User, Order, OrderItem]] ]设为a ,这样可以让我对结果进行flatMap,但不确定是什么让我购买.

无论如何,必须是一个更简洁/优雅的解决方案

谢谢

Tra*_*own 7

以下内容应完全相同:

def getInvoice(orderNum: String): Option[Invoice] = {
  val res = dao.byOrderNum(orderNum)

  res.headOption.map {
    case (user, order, _) => Invoices(user, order, res.map(_._3))
  }
}
Run Code Online (Sandbox Code Playgroud)

关键是headOption,它以更惯用的方式处理空虚检查(它给出None了一个空序列和Some(xs.head)一个非空序列).