使用string来获取没有反射的scala类的字段值?

时间:2018-04-23 17:21:34

标签: json scala

case class Foo {
    fieldA: Option[Double],
    fieldB: Option[Double]
}

    val foo = Foo( 
        fieldA = Some(1.0), 
        fieldB = Some(2.0)
)

给定字符串"fieldA",我想获得foo.fieldA的值,即Some(1.0)。是否可以不使用反射,因为代码将用于生产?

1 个答案:

答案 0 :(得分:3)

我想简短的回答是" no"。

稍微长一点的答案是,如果你想从任何元素中检索一个字段,只使用一个带有该元素名称的字符串,那么你必须使用反射。

那就是说,你可以编写一个查找函数,如下所示:

case class Foo(fieldA: Option[Double], fieldB: Option[Double]) {

  //...

  def byFieldName(name: String): Option[Double] = name match {
    case "fieldA" => fieldA
    case "fieldB" => fieldB
  }
}

它有点手册,但它有效。或者,您可以使用反射实现此函数,将结果缓存在Map[String, Option[Double]]中(假设所有此类字段具有相同的类型)。这样,您只能为每个查找字段获得一次性能。

更新:我应该指出,在任何情况下,也许这不是你想要的。如果您需要按名称检索字段值,以下内容是否适用于您而不是case class(在 Scala REPL 中演示)?

scala> type Foo = Map[String, Option[Double]]
defined type alias Foo

scala> val foo: Foo = Map("fieldA" -> Some(1.0), "fieldB" -> Some(2.0))
foo: Foo = Map(fieldA -> Some(1.0), fieldB -> Some(2.0))

scala> foo("fieldA")
res0: Option[Double] = Some(1.0)

也就是说,您是否可以使用Map数据结构来查找带标签的值?