从scala中的可选项创建列表的最佳方法是什么?

时间:2013-12-12 03:30:09

标签: list scala optional-parameters

我的代码包含一个带有少量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)
    }
  )
}

3 个答案:

答案 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