获取Scala中案例类字段名称的最快方法

时间:2014-05-27 08:14:44

标签: scala reflection

这与以下问题有关:In scala, how to turn object's values into Map[String, String]?

事实上,我几乎完全一样的问题。但是,在我的机器上迭代1000次(或手动编写函数以返回(键,)的列表时,在接受的答案中给出的解决方案比productIterator(仅返回字段的值)慢50倍左右。价值)对)。在Scala中获取案例类字段的名称是否有合理且高效的方法?我觉得奇怪的是,核心语言会提供一种高效的反射方式来获取值,而不是字段名称。

1 个答案:

答案 0 :(得分:2)

如果您编写并编译案例类,则可以浏览生成的字节代码,您会注意到字段名称没有硬编码到类的方法中。这意味着您必须使用反射来查找这些名称。不幸的是,反思性查询很昂贵。

使用productIterator,可以采用避免反射的方法。任何case类都实现了Product trait,它定义了一个方法Object productElement(int),它将返回给定索引处字段的值。除了字段名称之外,此信息被硬编码到案例类方法中。通过内部使用此方法,productIterator方法可以避免反射并且可以有效执行。

底线:虽然反射调用不是那么昂贵,但反思性查询却是如此。如果您需要字段名称信息,则应该只查找一次信息并缓存结果以供以后重用。