Scala 使用无形状HList检查带有选项字段的case类,以确保所有这些字段都是None

Scala 使用无形状HList检查带有选项字段的case类,以确保所有这些字段都是None,scala,shapeless,Scala,Shapeless,我有一个案例类: case class UserData(name: Option[String], age: Option[String]) { lazy val nonEmpty = name.isDefined || age.isDefined // TODO } 我是否可以使用例如Shapeless'HList来替换非空检查的当前实现,以便枚举所有字段以检查所有字段是否都设置为None或至少有一个字段具有值?我认为您也可以使用productIterator使用纯scala进行检查

我有一个案例类:

case class UserData(name: Option[String], age: Option[String]) {
  lazy val nonEmpty = name.isDefined || age.isDefined // TODO
}

我是否可以使用例如Shapeless'HList来替换非空检查的当前实现,以便枚举所有字段以检查所有字段是否都设置为None或至少有一个字段具有值?

我认为您也可以使用productIterator使用纯scala进行检查


我想您也可以使用productIterator检查纯scala

我想你想在case类中做不同的行为,如果你不想,那么@pamu-answer就是你想要的。 如果你真的想使用无形状,你可以,但没有必要

我想你想在case类中做不同的行为,如果你不想,那么@pamu-answer就是你想要的。 如果你真的想使用无形状,你可以,但没有必要

scala> val data = UserData(None, None)
data: UserData = UserData(None,None)

scala> data.productIterator.forall {
     | case x: Option[_] => x.isDefined
     | case _ =>  false
     | }
res2: Boolean = false

scala> val data = UserData(Some("foo"), Some("bar"))
data: UserData = UserData(Some(foo),Some(bar))

scala> data.productIterator.forall {
     | case x: Option[_] => x.isDefined
     | case _ =>  false // you may throw exception if you are not expecting this case
     | }
res3: Boolean = true


case class UserData(name: Option[String], age: Option[String]) {
  lazy val isEmpty = this.productIterator.forall(_ == None)
}

UserData(None,None).isEmpty
UserData(None,Some("s")).isEmpty