Scala 有条件地使用类生成器函数

Scala 有条件地使用类生成器函数,scala,functional-programming,Scala,Functional Programming,假设这种情况: 我有一个大小为n的元组。 每个元素都是一个布尔标志,用于定义是否应在对象上调用特定函数(此处:builder) 我首先想到的语法是: (el1, el2, el3, ...) => { val builder = MyBuilder() val builder1 = if(el1) builder.func1(...) else builder val builder2 = if(el2) builder1.func2(...) else builder

假设这种情况:

我有一个大小为n
元组。
每个元素都是一个
布尔
标志,用于定义是否应在对象上调用特定函数(此处:
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
   ...
}
val result = MyBuilder.
   .func1(...) //ONLY if el1!
   .func2(...) //ONLY if el2!
   .func3(...) //ONLY if el3!
   ....
   .funcn(...) //ONLY if el4!
最后一个构建器
builderN
将是所需的对象。但是这个代码很糟糕

什么是好的、干净的替代方案?(注意:我使用的是
cats

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

(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
   ...
}
val result = MyBuilder.
   .func1(...) //ONLY if el1!
   .func2(...) //ONLY if el2!
   .func3(...) //ONLY if el3!
   ....
   .funcn(...) //ONLY if el4!

编辑:修复了示例代码

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

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

我认为问题在于最初的假设,即您的输入应该是一个标志元组,告诉您是否应该将函数应用于某些输入。这已经是一种代码味道,不会产生一个好的功能解决方案。也许您可以分享您试图解决的实际问题,我们可以提出不同的设计。这是使用此typesafe认可库的结果:。请参阅自述文件第一个示例中的
mapN