How To Access access Case class field Value from String name of the field

前端 未结 3 2026
忘掉有多难
忘掉有多难 2021-01-04 19:51

How should I extract the value of a field of a case class from a given String value representing the field.

For example:

case class Person(name: Stri         


        
3条回答
  •  隐瞒了意图╮
    2021-01-04 20:41

    What you're looking for can be achieve using Shapeless lenses. This will also put the constraint that a field actually exists on a case class at compile time rather than run time:

    import shapeless._
    
    case class Person(name: String, age: Int)
    
    val nameLens = lens[Person] >> 'name
    val p = Person("myName", 25)
    
    nameLens.get(p)
    

    Yields:

    res0: String = myName
    

    If you try to extract a non existing field, you get a compile time error, which is a much stronger guarantee:

    import shapeless._
    
    case class Person(name: String, age: Int)
    
    val nonExistingLens = lens[Person] >> 'bla
    val p = Person("myName", 25)
    
    nonExistingLens.get(p)
    

    Compiler yells:

    Error:(5, 44) could not find implicit value for parameter mkLens: shapeless.MkFieldLens[Person,Symbol with shapeless.tag.Tagged[String("bla")]]
    val nonExistingLens = lens[Person] >> 'bla
    

提交回复
热议问题