在 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](...)
...
无形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
假设我们有一个对象集合,所有对象都是大小写 类,并且所有对象都有一个字段,比如一个 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](...)
...
无形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