Лучше всего определить свой собственный метод:
class ConditionalMapper[A](a: A) {
def changeCheck(p: A => Boolean)(f: A => A) = if (p(a)) f(a) else a
def changeIf(b: Boolean)(f: A => A) = if (b) f(a) else a
}
implicit def conditionally_change_anything[A](a: A) = new ConditionalMapper(a)
Теперь вы объедините эти вещи вместе и напишите:
class Normer(makeLC: Boolean, remVowel: Boolean, dropFirst: Boolean) {
def normalize(s: String) = {
s.changeIf(makeLC) { _.toLowerCase }
.changeIf(remVowel) { _.replaceAll("[aeiou]","") }
.changeIf(dropFirst){ _.substring(1) }
}
}
Что даст вам:
scala> val norm = new Normer(true,false,true)
norm: Normer = Normer@2098746b
scala> norm.normalize("The Quick Brown Fox Jumps Over The Lazy Dog")
res1: String = he quick brown fox jumps over the lazy dog
Тем не менее, изменяемое решение тоже неплохое - просто держите его в маленьком блоке, и все будет в порядке.Это в основном проблема, когда вы позволяете изменчивости уйти в дикую природу.(Где «дикий» означает «вне вашего метода или внутри любого метода, длина которого превышает несколько строк».)