有条件地使用类似构建器的函数

Mar*_*pel 3 functional-programming scala

假设这种情况:

我有一个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
   ...
}
Run Code Online (Sandbox Code Playgroud)

最后一个构建器builderN将是所需的对象.但这段代码很讨厌.

什么是一个好的,干净的选择?(注意:我正在使用cats.)

表示我的问题的另一种方式是:

val result = MyBuilder.
   .func1(...) //ONLY if el1!
   .func2(...) //ONLY if el2!
   .func3(...) //ONLY if el3!
   ....
   .funcn(...) //ONLY if el4!
Run Code Online (Sandbox Code Playgroud)

编辑:修复示例代码!

Naz*_*iuk 5

您可以使用构建函数列表压缩标记列表,然后在折叠条件应用构建器函数中

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
}
Run Code Online (Sandbox Code Playgroud)

打印到控制台:

func1
func3
Run Code Online (Sandbox Code Playgroud)