加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

如何使用函数式编程方法在Scala中重写此代码

发布时间:2020-12-16 18:26:45 所属栏目:安全 来源:网络整理
导读:下面是执行一些URL规范化的代码片段.如何重写它只使用不可变变量? 当然,不要让它更大或更复杂. private def normalizeUrl(url0: String) = { var url = url0 if (url.endsWith("/")) { url = url.dropRight(1) } if (url.indexOf(':') 0 || url.indexOf(':'
下面是执行一些URL规范化的代码片段.如何重写它只使用不可变变量?

当然,不要让它更大或更复杂.

private def normalizeUrl(url0: String) = {
  var url = url0

  if (url.endsWith("/")) {
    url = url.dropRight(1)
  }

  if (url.indexOf(':') < 0 || 
      url.indexOf(':') == 1) { //windows absolute path
    url = "file:" + url;
  }

  url = url.replaceAll("\","/");

  url
}

解决方法

如果你想将一堆if / then条件链接起来修改一个字符串,你可以考虑添加一个隐式类来处理if / then评估,如下所示:

object UrlPimping{
  implicit class PimpedUrl(val url:String) extends AnyVal{
    def changeIf(condition:String => Boolean)(f:String => String):String = {
      if (condition(url)) f(url)
      else url      
    }
  }
}

private def normalizeUrl(url: String) = {
  import UrlPimping._

  url.
    changeIf(_.endsWith("/"))(_.dropRight(1)).
    changeIf(u => u.indexOf(':') < 0 || u.indexOf(':') == 1)(u => s"file:$u").
    replaceAll("\","/")
}

如果你只考虑这两个条件,这将是一种过度杀伤,但如果你有更多的条件可能会很好,这是一个常见的模式.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读