我有configurer
支持链样式,如下所示:
val configurer = Configurer("init").propA("a").propB(3).propC("bla-bla")
这是我无法更改的第三方音乐库。
我有我的
案例类Config(propA:Option [String],propB:Option [Int],propC:
选项[字符串])
现在,我需要使用给定的
configurer
对象构建我的config
,如果在propX
中设置了相应的值,则应调用方法config
。以功能方式做到这一点的最佳方法是什么?
我不喜欢这样
val configurer = Configurer("init")
val withPropA = config.propA.map(configurer.propA).getOrElse(configure)
val withPropB = config.propB.map(configurer.propB).getOrElse(withPropA)
val withPropC = config.propC.map(configurer.propC).getOrElse(withPropB)
只是觉得应该有一种优雅的方式。
最佳答案
您可以使用var做到这一点,通常这是scala中代码不良的标志,但在这种情况下,我认为这是绝对可以接受的。
def buildConfigurer(propA: Option[String], propB: Option[Int], propC: Option[String]) = {
var configurer = new Configurer("init")
propA.foreach(a => configurer = configurer.propA(a))
propB.foreach(b => configurer = configurer.propB(b))
propC.foreach(c => configurer = configurer.propC(c))
configurer
}