如何在scala中优化这个简单的函数

Fre*_*ind 0 string scala

我写了一个简单的函数,将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,可以使这个方法只有一行.

Pav*_*tin 7

在这种情况下最好使用正则表达式:

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)

(你也可以使用"匹配",但需要不止一行)