Constructing simple Scala case classes from Strings, strictly without boiler-plate

后端 未结 2 733
名媛妹妹
名媛妹妹 2020-12-12 15:37

I seek succinct code to initialize simple Scala case classes from Strings (e.g. a csv line):

case class Person(name: String, age: Double)
case class Book(tit         


        
2条回答
  •  甜味超标
    2020-12-12 16:04

    object Creator {
      def create[T: ClassTag](params: String): T = {
        val ctor = implicitly[ClassTag[T]].runtimeClass.getConstructors.head
        val types = ctor.getParameterTypes
    
        val paramsArray = params.split(",").map(_.trim)
    
        val paramsWithTypes = paramsArray zip types
    
        val parameters = paramsWithTypes.map {
          case (param, clas) =>
            clas.getName match {
              case "int" => param.toInt.asInstanceOf[Object] // needed only for AnyVal types
              case "double" => param.toDouble.asInstanceOf[Object] // needed only for AnyVal types
              case _ =>
                val paramConstructor = clas.getConstructor(param.getClass)
                paramConstructor.newInstance(param).asInstanceOf[Object]
            }
    
        }
    
        val r = ctor.newInstance(parameters: _*)
        r.asInstanceOf[T]
      }
    }
    

提交回复
热议问题