Scala 有条件地使用类生成器函数
假设这种情况: 我有一个大小为n的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
元组。
每个元素都是一个布尔
标志,用于定义是否应在对象上调用特定函数(此处: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
。