我写了一个简单的函数,将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#
}
}
Run Code Online (Sandbox Code Playgroud)
我认为这段代码不是很好,不是scala-way.由于我是scala的新手,我不知道如何将它优化成一行,或者只是一个链?
例如:
def fix(text: String) = {
text.replace("b", "*") op { t =>
if (t.endsWith("c")) {
t.stripSuffix("c") + ("#")
} else t
}
}
Run Code Online (Sandbox Code Playgroud)
这是我预期的链条.注意方法op,希望有这样的方法,比如map.我们不必在这里定义变量.
或者scala中有一些其他的API,可以使这个方法只有一行.
在这种情况下最好使用正则表达式:
def fix(s: String) = s.replace('b', '*').replaceFirst("c$", "#")
Run Code Online (Sandbox Code Playgroud)
如果您需要一个单行转型链:
def fix(s: String) =
Some(s.replace('b', '*')).map(s => if(s.endsWith "c") s.init + "#" else s).get
Run Code Online (Sandbox Code Playgroud)
要么
def fix(s: String) =
Some(s).filter(_ endsWith "c").map(_.init + '#').getOrElse(s).replace('b', '*')
Run Code Online (Sandbox Code Playgroud)
(你也可以使用"匹配",但需要不止一行)