考虑到我们有一个对象集合,它们都是case类,而且它们都有一个字段,比如uuid,我们希望收集这些字段以供进一步使用。在我的特殊情况下,对象作为来自四个不同数据库表的行出现。在其他情况下,它们可能只是来自某个异构容器,或者是从管道中流出来的,或者其他什么的。
使用java的混合自省,我可以一次性阅读所有uuids,如
val LocalTables=Seq(t1,t2,t3,t4)
for (t <- LocalTables) {
t foreach ( v => {
val metodo=v.getClass.getDeclaredMethod("id")
println(metodo.invoke(v))
}
}
但我觉得很脏。有什么方法可以告诉scala直接访问v.id吗?
这个具体的用例是用于数据库访问的,所以它可以通过一个特定的查询来解决。但问题更为普遍,我想了解可以使用哪些工具对一些异构值集合进行预测。
发布于 2015-01-20 22:47:11
在精确/安全和简单/灵活之间有多种选择。很多哈斯克尔逻辑都适用。浮现在脑海中的选择是:
构造类型
使用起来非常容易,而且或多或少是安全的,即使它们最终被编译成反射:
val localTables = Seq[{def id: UUID}](t1, t2, t3, t4)
localTables foreach {t => println(t.id)}
一个特点
非常安全,但需要修改类型:
trait HasId { def id: UUID }
case class Something(id: UUID, ...) extends HasId
val localTables = Seq[HasId](...)
...
无型HList
和poly
安全和灵活,但更吓人
import shapeless._, hlist._, poly._
object extractId extends Poly1 {
implicit val caseFoo = at[Foo](_.id)
implicit val caseBar = at[Bar](_.id)
...
}
val localTables = t1 :: t2 :: ... :: HNil // of type Foo :: Bar :: ... :: HNil
val ids: List[UUID] = localTables map extractId toList
ids foreach println
https://stackoverflow.com/questions/28054013
复制相似问题