2

List [Tuple3 [User、Order、OrderItem]]のクエリ結果があります

請求書のケースクラスインスタンスを作成するために、そのコンパニオンオブジェクトは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にすることができますが、それが何を買うのかわかりません。

とにかく、問題に対するより簡潔でエレガントな解決策でなければなりません

ありがとう

4

2 に答える 2

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)ます)。

于 2012-08-02T22:48:37.283 に答える
4

物事はきちんとしていて、そこにあるのでそれを使用したheadOptionほうがよいかもしれませんが、(オプションをマッピングするのではなく)リストでパターンマッチを行うことができます。これはあなたの質問の一種ですが、少し整理する必要があります上:

res match {
  case (a, b, _) :: _ => Some(Invoices(a, b, res.map(_._3)))
  case _              => None
}
于 2012-08-02T23:42:18.540 に答える