我想根据不同条件的结果添加一个元素。 现在,我是这样做的:
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的可变对象,并且我不知道在这里是否合适。
答案 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] = ???