Учитывая следующий код:
case class Config(
addThree: Boolean = true,
halve: Boolean = true,
timesFive: Boolean = true
)
def doOps(num: Integer, config: Config): Integer = {
var result: Integer = num
if ( config.addThree ) {
result += 3
}
if ( config.halve ) {
result /= 2
}
if ( config.timesFive ) {
result *= 5
}
result
}
val config = Config(true,false,true)
println( doOps(20, config) )
println( doOps(10, config) )
Я хотел бы заменить уродливый метод doOps более эффективной и идиоматической конструкцией. В частности, я хотел бы построить цепочку функций, которая выполняет только необходимые преобразования на основе конкретной используемой конфигурации. Я знаю, что, вероятно, хочу создать какую-то частично прикладную функцию, в которую я могу передать Integer, но я не знаю, как добиться этого эффективным способом.
Я специально хочу избежать операторов if внутри doOps, я хочу, чтобы результирующая структура была просто цепочкой функций, которая вызывает следующую в цепочке без предварительной проверки условного выражения.
Результирующий код, я думаю, будет выглядеть примерно так:
case class Config(
addThree: Boolean = true,
halve: Boolean = true,
timesFive: Boolean = true
)
def buildDoOps(config: Config) = ???
val config = Config(true,false,true)
def doOps1 = buildDoOps(config)
println( doOps1(20) )
println( doOps1(10) )