Как построить Seq в зависимости от различных условий, которые следуют друг за другом - PullRequest
5 голосов
/ 16 мая 2019

Я хотел бы добавить элемент в зависимости от результата другого условия.Как и сейчас, я сделал это следующим образом:

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 ]

7 голосов
/ 16 мая 2019

Объявите список кортежей с условиями слева и перечислениями справа:

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
}
3 голосов
/ 16 мая 2019

Без надлежащего контекста я не могу предложить более конкретного решения, но я думаю, что этот псевдокод представляет вашу проблему.
Если у вас есть какие-либо вопросы, не сомневайтесь, обращайтесь за разъяснениями.

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] = ???
3 голосов
/ 16 мая 2019

Есть несколько способов сделать это. Вот что вышло мне на ровном месте:

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

Они являются способом разложить обе эти процедуры по функциям или сгибам, но в этом состоянии это может быть переосмыслением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...