使用Scala应用程序将List[Object]转换为case类

使用Scala应用程序将List[Object]转换为case类,scala,deserialization,applicative,Scala,Deserialization,Applicative,我正在编写一个Scala应用程序,用作后端数据库 当我查询Datomic时,它返回“行”作为java.util.Lists ofLists ofjava.lang.Objects。例如: [ [ "Joe", "1970-04-15" ], [ "Mary", "1975-06-01" ] ] 我想以最具Scala风格的方式将这些类转换为case类 当前我的代码如下所示: import org.joda.time._ case class Person(name: String, da

我正在编写一个Scala应用程序,用作后端数据库

当我查询Datomic时,它返回“行”作为
java.util.List
s of
List
s of
java.lang.Object
s。例如:

[
  [ "Joe", "1970-04-15" ],
  [ "Mary", "1975-06-01" ]
]
我想以最具Scala风格的方式将这些类转换为case类

当前我的代码如下所示:

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]))
这有点难看,而且容易出错


有没有一种方法可以使用应用程序函子实现同样的功能?应用函子是最好的方法吗?有更好的方法吗?

有一个由Clearcuid编写的名为的很好的库,它以类型安全的方式弥合了Datomic(Clojure)和Scala之间的鸿沟。看看他们是如何做到这一点的:


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

Sweet!我想这正是我所需要的。@Ralph是的,当有人为你写一个库来做你想做的事情时总是好的。我倾向于写方轮。这实际上回答了我的问题,但我想我将使用@wheaties描述的技术。
result.collect {case name::date::Nil => Person(name.toString, LocalDate.parse(date.toString)}
          // or case List(name,date) => ...
result.collect {case name::date::Nil => Person(name.toString, LocalDate.parse(date.toString)}
          // or case List(name,date) => ...