如何在无形中创建生成的对象
How to create generated objects in shapeless
假设我有一个通用类型的规范化数据库模型,如下所示:
case class BaseModel(id: String,
createdBy: String,
attr1: Option[String] = None,
attr2: Option[Int] = None,
attr3: Option[LocalDate] = None)
给定一个BaseModel
的序列,如果所有某个Option
属性的字段都没有填充,shapeless可以为我创建一个简化模型吗?
例如,假设所有 attr1
字段都是空的。 无需我事先指定对象 shapeless 可以创建一个看起来像这样的通用对象吗?
case class BaseModel(id: String,
createdBy: String,
attr2: Option[Int] = None,
attr3: Option[LocalDate] = None)
Shapeless 可以做的是,给定两种情况 classes,从另一个的对象创建其中一个的对象。
import java.time.LocalDate
import shapeless.LabelledGeneric
import shapeless.record._
case class BaseModel(id: String,
createdBy: String,
attr1: Option[String] = None,
attr2: Option[Int] = None,
attr3: Option[LocalDate] = None)
case class BaseModel1(id: String,
createdBy: String,
attr2: Option[Int] = None,
attr3: Option[LocalDate] = None)
val bm = BaseModel(
id = "cff4545gvgf",
createdBy = "John Doe",
attr2 = Some(42),
attr3 = Some(LocalDate.parse("2018-11-03"))
) // BaseModel(cff4545gvgf,John Doe,None,Some(42),Some(2018-11-03))
val hlist = LabelledGeneric[BaseModel].to(bm)
val hlist1 = hlist - 'attr1
val bm1 = LabelledGeneric[BaseModel1].from(hlist1)
// BaseModel1(cff4545gvgf,John Doe,Some(42),Some(2018-11-03))
但 Shapeless 无法创建新案例 class。如果您需要自动创建一个新案例 class,您可以编写一个宏。
假设我有一个通用类型的规范化数据库模型,如下所示:
case class BaseModel(id: String,
createdBy: String,
attr1: Option[String] = None,
attr2: Option[Int] = None,
attr3: Option[LocalDate] = None)
给定一个BaseModel
的序列,如果所有某个Option
属性的字段都没有填充,shapeless可以为我创建一个简化模型吗?
例如,假设所有 attr1
字段都是空的。 无需我事先指定对象 shapeless 可以创建一个看起来像这样的通用对象吗?
case class BaseModel(id: String,
createdBy: String,
attr2: Option[Int] = None,
attr3: Option[LocalDate] = None)
Shapeless 可以做的是,给定两种情况 classes,从另一个的对象创建其中一个的对象。
import java.time.LocalDate
import shapeless.LabelledGeneric
import shapeless.record._
case class BaseModel(id: String,
createdBy: String,
attr1: Option[String] = None,
attr2: Option[Int] = None,
attr3: Option[LocalDate] = None)
case class BaseModel1(id: String,
createdBy: String,
attr2: Option[Int] = None,
attr3: Option[LocalDate] = None)
val bm = BaseModel(
id = "cff4545gvgf",
createdBy = "John Doe",
attr2 = Some(42),
attr3 = Some(LocalDate.parse("2018-11-03"))
) // BaseModel(cff4545gvgf,John Doe,None,Some(42),Some(2018-11-03))
val hlist = LabelledGeneric[BaseModel].to(bm)
val hlist1 = hlist - 'attr1
val bm1 = LabelledGeneric[BaseModel1].from(hlist1)
// BaseModel1(cff4545gvgf,John Doe,Some(42),Some(2018-11-03))
但 Shapeless 无法创建新案例 class。如果您需要自动创建一个新案例 class,您可以编写一个宏。