我有一个要求,对于一个包含大约30个Option[T]字段的给定案例类,至少需要有1个非空字段才能被视为有效。 为了不逐个检查每个字段,我选择通过反射以通用的方式检查所有字段。我想出来的代码(基于SO上的一些其他答案)是:
import scala.reflect.runtime.universe._
import scala.reflect.runtime.{universe => ru}
// gets all methods of a Case Class
def getMethods[T: ru.TypeTag] = typeOf[T].members.collect {
case m: MethodSymbol if m.isCaseAccessor => m
}.toList
/**
* Returns the value of all Case Class fields
* @param obj case class object
* @return a Sequence of all field values
*/
def getAllCaseClassFieldValues[T: ru.TypeTag](obj: Object): Seq[Any] = {
val mirror = ru.runtimeMirror(getClass.getClassLoader)
getMethods[T].map(m => mirror.reflect(obj).reflectField(m).get)
}
案例类:
case class SampleRequest(field1: Option[String], field2: Option[String], //.... up to 30 or more fields
检查至少有一个非空的代码:
val fieldValues = getAllCaseClassFieldValues[SampleRequest](r)
val noneCount = fieldValues.count(_ == None)
val atLeastOneNonEmpty = noneCount < fieldValues.size
我在想是否有更好的方式通过反射或其他机制来验证这个内容?