这与以下问题有关:在scala中,如何将object's的值转换为Map[String, String]?
事实上,我也有几乎完全相同的问题。然而,当在我的机器上迭代1000次(或手动编写一个函数来返回(键,值)对列表)时,在可接受的答案中给出的解决方案比productIterator
(仅返回字段的值)慢50倍左右。是否有一种合理的性能和干净的方式来获取Scala中case类的字段名称?对我来说,核心语言提供了一种类似于反射的高性能获取值的方式,而不是字段名,这似乎很奇怪。
如果您编写并编译一个case类,您可以浏览生成的字节码,您会注意到字段名没有硬编码到类的方法中的任何地方。这意味着您必须使用反射来查找这些名称。不幸的是,反射查找的开销很大。
对于productIterator
,有一种方法可以避免反射。任何case类实现Product
特性,该特性定义了一个方法Object productElement(int)
,该方法将返回给定索引处字段的值。除了字段名之外,这些信息被硬编码到case类方法中。通过在内部使用这个方法,productIterator
方法避免了反射,可以有效地执行。
底线:虽然反射调用不是那么昂贵,但反射查找是。如果您需要字段名信息,那么您应该只查找一次信息,并缓存结果以供以后重用。