如何根据彼此遵循的不同条件构造Seq

时间:2019-05-16 16:16:57

标签: scala functional-programming

我想根据不同条件的结果添加一个元素。 现在,我是这样做的:

val add1 = if(condition1) Seq(ENUM_ELEMENT_1) else Seq()
val add2 = if(condition2) Seq(ENUM_ELEMENT_2) else Seq()

return Seq(add1, add2).flatten

如果我使用Java,则只需在开头创建一个空的ArrayList(),然后在代码遇到ifs时将其添加到此列表中。 但是在Scala中,我将不得不使用Seq的可变对象,并且我不知道在这里是否合适。

3 个答案:

答案 0 :(得分:7)

声明元组列表,条件在左侧,枚举在右侧:

val conditions: Seq[(Boolean, Enum)] = List(
   condition1 -> ENUM_ELEMENT1,
   condition2 -> ENUM_ELEMENT2
)

然后您可以使用collect将其减少:

val result: Seq[String] =  conditions.collect{
    case (true, v) => v
}

flatMap

val result: Seq[Enum] = conditions.flatMap{
   case (true, v) => Some(v)
   case _ => None
}

答案 1 :(得分:3)

有几种方法可以做到这一点。这是我的出乎意料的事情:

(if(condition1) Seq(ENUM_ELEMENT_1) else Seq()) ++ (if(condition2) Seq(ENUM_ELEMENT_2) else Seq())

它们是通过函数或折叠将这两个过程分解的方法,但在此状态下可能会过分考虑。

答案 2 :(得分:3)

没有适当的上下文,我无法提供更具体的解决方案,但我认为此伪代码代表您的问题。
如有任何疑问,请不要怀疑。

object ListFactory {
  type Input = ???
  type Output = ???

  private val allElements: List[Output] =
    List(ENUM_ELEMENT_1, ENUM_ELEMENT_2, ???)

  private val conditions: List[Input => Boolean] =
    List(???)

  def apply(input: Input): List[Output] =
    (allElements zip conditions).collect {
      case (element, condition) if (condition(input)) => element
    }
}

ListFactory(???) // res1: List[Output] = ???