list - scala:将 List[ Tuple3[A,B,C] ] 转换为 Foo(A, B, List[C]) 的最短方法

标签 list scala mapping 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
}

我可以将查询结果设为 List[ Option[Tuple3[User, Order, OrderItem]] ],这将让我对结果进行 flatMap,但不确定这会给我带来什么。

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

谢谢

最佳答案

以下内容应该完全相同:

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 ) 对于非空)。

关于list - scala:将 List[ Tuple3[A,B,C] ] 转换为 Foo(A, B, List[C]) 的最短方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11786707/

相关文章:

html - CSS 目录 - 嵌套列表后计数器不会重置

python - 将 mysql select 语句的输出存储为 python 列表

scala 在 for 循环内执行

java - JVM OutOfMemory 错误 "death spiral"(不是内存泄漏)

r - 将命名向量转换为命名列表

visual-studio - 创建 SharePoint 2013 查找列表列 Visual Studio 2012 列表设计器

inheritance - “特征A <:B”是什么意思?

javascript - xml 到 json 映射挑战

elasticsearch - 动态模板支持默认类型吗?

ios - RestKit 0.20 忽略 putObject : mapping