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

时间:2011-02-28 09:57:41

标签: 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#
    }
}

我认为这段代码不是很好,不是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,可以使这个方法只有一行。

3 个答案:

答案 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 }
}