Использование функций, подобных построителю, условно - PullRequest
0 голосов
/ 05 сентября 2018

Допустим, такая ситуация:

У меня есть Tuple размера n . Каждый элемент представляет собой флаг Boolean, который определяет, должна ли определенная функция вызываться для объекта (здесь: builder).

Синтаксис, который приходит мне в голову первым:

(el1, el2, el3, ...) => {
   val builder = MyBuilder()

   val builder1 = if(el1) builder.func1(...) else builder
   val builder2 = if(el2) builder1.func2(...) else builder1
   val builder3 = if(el3) builder2.func3(...) else builder2
   ...
}

Последний строитель builderN будет желаемым объектом. Но этот код неприятен.

Что было бы хорошей, чистой альтернативой? (Примечание: я использую cats.)

Другой способ изобразить мою проблему:

val result = MyBuilder.
   .func1(...) //ONLY if el1!
   .func2(...) //ONLY if el2!
   .func3(...) //ONLY if el3!
   ....
   .funcn(...) //ONLY if el4!

РЕДАКТИРОВАТЬ: Исправлен пример кода!

1 Ответ

0 голосов
/ 05 сентября 2018

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

class Builder() {

  def func1(in: Any): Builder = {
    println("func1")
    this
  }

  def func2(in: Any): Builder = {
    println("func2")
    this
  }

  def func3(in: Any): Builder = {
    println("func3")
    this
  }
}

val flags = List(true, false, true)
val funcs = List[Builder => Builder](b => b.func1(1), b => b.func2(2), b => b.func3(3))
val result = flags.zip(funcs).foldLeft(new Builder()) {
  case (builder, (flag, func)) => if (flag) func(builder) else builder
}

вывод на консоль:

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