一个函数的优化(从命令式到函数式)

        本文是从“Scala热情交流群(132569382)”的讨论中整理出来。

        我想写一个函数:把一个字符串里的b改为*,把结尾的c改为#。一份可行的Scala代码如下:
 
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#
    }
}

可以看出,还是在用java的方式来写,不够函数化,那应该怎么优化呢?
 
        首先,要转变思想,比如使用正则表达式:
 
def fix(s: String) = s.replace('b', '*').replaceAll("c$", "#")

  或者
def fix(s: String) = Some(s.replace('b', '*')).map(s => if(s.endsWith("c")) s.init + "#" else s).get

 又或者

def fix(test: String) = text.replace("b", "*") match { 
 case t if (t.endsWith("c")) => t.stripSuffix("c") + ("#") 
 case t => t
}

        函数式的风格写起来就是很爽,如行云流水一般。从java到scala,不仅仅是语法变了,更重要的是编程的风格,这个转变可不容易。风自由在stackoverflow上问了这个问题,请参见完整版:http://stackoverflow.com/questions/5140465/how-to-optimize-this-simple-function-in-scala

转载于:https://my.oschina.net/aiguozhe/blog/35214

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值