首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在scala中读取异构集合的所有成员的相同属性?

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

Stack Overflow用户
提问于 2015-01-20 19:52:51
回答 1查看 91关注 0票数 1

考虑到我们有一个对象集合,它们都是case类,而且它们都有一个字段,比如uuid,我们希望收集这些字段以供进一步使用。在我的特殊情况下,对象作为来自四个不同数据库表的行出现。在其他情况下,它们可能只是来自某个异构容器,或者是从管道中流出来的,或者其他什么的。

使用java的混合自省,我可以一次性阅读所有uuids,如

代码语言:javascript
运行
复制
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吗?

这个具体的用例是用于数据库访问的,所以它可以通过一个特定的查询来解决。但问题更为普遍,我想了解可以使用哪些工具对一些异构值集合进行预测。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-20 22:47:11

在精确/安全和简单/灵活之间有多种选择。很多哈斯克尔逻辑都适用。浮现在脑海中的选择是:

构造类型

使用起来非常容易,而且或多或少是安全的,即使它们最终被编译成反射:

代码语言:javascript
运行
复制
val localTables = Seq[{def id: UUID}](t1, t2, t3, t4)
localTables foreach {t => println(t.id)}

一个特点

非常安全,但需要修改类型:

代码语言:javascript
运行
复制
trait HasId { def id: UUID }
case class Something(id: UUID, ...) extends HasId
val localTables = Seq[HasId](...)
...

无型HListpoly

安全和灵活,但更吓人

代码语言:javascript
运行
复制
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
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28054013

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档