3

我正在编写一个使用Datomic作为后端数据库的 Scala Play Framework应用程序。

java.util.List当我查询 Datomic 时,它以s of Lists of s 的形式返回“rows” java.lang.Object。例如:

[
  [ "Joe", "1970-04-15" ],
  [ "Mary", "1975-06-01" ]
]

我想以最符合 Scala 习惯的方式将这些转换为案例类。

目前我的代码如下所示:

import org.joda.time._
case class Person(name: String, dateOfBirth: LocalDate)

// assuming the query returns 1 row, get the row List
val row = result.iterator.next  // e.g.: [ "Joe", "1970-04-15" ]
User(row.get(0).asInstanceOf[String],
     LocalDate.parse(row.get(1).asInstanceOf[String]))

这有点丑陋且容易出错。

有没有办法使用应用函子来实现同样的事情?应用函子是最好的方法吗?有没有更好的办法?

4

2 回答 2

2

Pellucid 编写了一个名为Datomisca的优秀库,它以类型安全的方式弥合了 Datomic(Clojure) 和 Scala 之间的差距。看看他们如何进行转换

val entity = database.entity(entityId)
val name   = entity.as[String](person / "name")
val age    = entity.as[Long](person / "age")

这是从他们的网站上直接取出的。

于 2013-12-30T14:22:18.147 回答
2
result.collect {case name::date::Nil => Person(name.toString, LocalDate.parse(date.toString)}
          // or case List(name,date) => ...
于 2013-12-30T14:23:10.193 回答