我写了一个简单的函数,将字符串的所有b
字符替换为*
,如果它以c
结尾,则将结尾c
替换为#
。
所以我把代码编写为:
object Main {
def fix(text: String) = {
val s = text.replace("b", "*")
if (s.endsWith("c")) {
s.stripSuffix("c") + ("#")
} else s
}
def main(args: Array[String]) {
println(fix("abbbbccc")) // -> a***cc#
}
}
我认为这段代码不是很好,不是scala-way。由于我是scala的新手,我不知道如何将它优化成一行,或只是一个链?
例如:
def fix(text: String) = {
text.replace("b", "*") op { t =>
if (t.endsWith("c")) {
t.stripSuffix("c") + ("#")
} else t
}
}
这是我预期的链条。请注意方法op
,我希望有这样的方法,如map
。我们不必在这里定义变量。
或者scala中有一些其他API,可以使这个方法只有一行。
答案 0 :(得分:7)
在这种情况下最好使用regular expressions:
def fix(s: String) = s.replace('b', '*').replaceFirst("c$", "#")
如果您需要一个单行转型链:
def fix(s: String) =
Some(s.replace('b', '*')).map(s => if(s.endsWith "c") s.init + "#" else s).get
或
def fix(s: String) =
Some(s).filter(_ endsWith "c").map(_.init + '#').getOrElse(s).replace('b', '*')
(您也可以使用“匹配”,但需要多行)
答案 1 :(得分:1)
你真的希望看到你的“操作”操作员:
text.replace("b", "*") match {
case t if (t.endsWith("c")) => t.stripSuffix("c") + ("#")
case t => t
}
答案 2 :(得分:1)
如果你喜欢正则表达式,你可以这样做:
def fix(text: String) = {
val EndsWithc = """(.*)c$""".r
text.replace('b', '*') match { case EndsWithc(s) => s + "#" ; case t => t }
}