在 scala 中读取异构集合的所有成员的相同 属性?

Read a same property of all the members of an heterogeneous collection, in scala?

假设我们有一个对象集合,所有对象都是大小写 类,并且所有对象都有一个字段,比如一个 uuid,我们希望收集该字段以供进一步使用。在我的特定情况下,对象来自四个不同的数据库表的行。在其他情况下,它们可能仅来自某个异构容器,或从管道流式传输,或其他。

使用来自 java 的内省组合,我可以一次读取所有 uuid,如

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 吗?

此具体用例用于数据库访问,因此可以通过特定查询轻松解决。但问题更为普遍,我想了解可以使用哪些工具 运行 a foreach 对一些异构值的集合。

有多种选择可以在 precision/safety 和 simplicity/flexibility 之间进行权衡。许多 logic for Haskell 适用。想到的选项是:

结构类型

非常易于使用且或多或少安全,即使它们最终编译为反射:

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](...)
...

无形HListpoly

安全灵活,但有点吓人

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