我的代码包含一个带有少量Option字段的case类(ContentBlock)。我想创建一个从这些字段构建的对象列表(描述),如果它们不是“无”...所以我已经制作了以下代码,这是有效的,但我强烈怀疑是可怕的。首先,匹配不考虑“无”,它只是删除了地板上没有任何字段,编译器正确地告诉我这是不好的。
做这样的事情最好的模式是什么?这是代码......
implicit def ContentBlockToDescriptionList(a: ContentBlock): List[Description] = {
List[Description](
a.instructions match {
case Some(x) => new Description("Instructions", x)
},
a.terms_and_conditions match {
case Some(x) => new Description("Terms and Conditions", x)
},
a.cancellation_addendum match {
case Some(x) => new Description("Cancellation Addendum", x)
}
)
}
答案 0 :(得分:3)
如果每个可选字段的基础类型相同,则可以写:
List(("Instructions", a.instructions),
("Terms and Conditions", a.terms_and_conditions),
("Cancellation Addendum", a.cancellation_addendum)
).collect {
case (desc, Some(x)) => new Description(desc, x)
}
顺便说一句,原始代码不会“将无值放在地板上”;它应该使用非详尽匹配警告进行编译,并且在运行时将使用MatchError
进行编译。
答案 1 :(得分:2)
您可以像这样简化:
List(
a.instructions map (new Description("Instructions", _)),
a.terms_and_conditions map (new Description("Terms and Conditions", _)),
a.cancellation_addendum map (new Description("Cancellation Addendum", _))
).flatten
答案 2 :(得分:0)
也许你可以使用flatten
。像这样:
implicit def ContentBlockToDescriptionList(a: ContentBlock): List[Description] =
List[Option[Description]](
a.instructions.map(new Description("Instructions", _)),
a.terms_and_conditions.map(new Description("Terms and Conditions", _)),
a.cancellation_addendum.map(new Description("Cancellation Addendum", _))
).flatten