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)
编辑:修复示例代码!
您可以使用构建函数列表压缩标记列表,然后在折叠条件应用构建器函数中
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)