删除可变状态和if语句

时间:2015-04-29 20:27:45

标签: scala

下面的代码返回页面中的所有链接。 代码被简化为暴露我试图实现的改进。 如何删除围绕hrefStringListBuffer&的可变状态href并使用惯用的Scala?

  val hrefList = List("href1" , "href2")
  val url = "testUrl"

  var hrefStringListBuffer = new scala.collection.mutable.ListBuffer[String]()
  for (l <- hrefList) {
    var href = getHref(l)
    if (!href.startsWith("http")) {
      href = getDomainName(url) + "/" + href
    }

    hrefStringListBuffer = hrefStringListBuffer :+ href
  }

  def getHref(str : String) = str
  def getDomainName(url : String) = url

  hrefStringListBuffer.foreach(m => println(m))

有点像? :

val lb = new scala.collection.mutable.ListBuffer[String]()
  hrefList.map(m => {
      lb :+ getDomainName(m)
  })

但是如何迎合开始和支票?

2 个答案:

答案 0 :(得分:0)

由于map只是将一个值转换为另一个值,所以您关心的只是map的返回主体:

val lb = hrefList.map { l =>
  val href = getHref(l)
  if (href.startsWith("http"))
    href
  else
    getDomainName(url) + "/" + href
}

即。正文中的href可以是val,您可以返回它或getDomainName结构的结果。

顺便说一句,lb本身就是一个不可变的List。不需要任何可变构造作为其任何部分。

答案 1 :(得分:0)

我会使用map并收集:

hrefList.map(getHref(_)).collect{
  case elem if !elem.startsWith("http") => getDomainName(url) + "/" +  elem
  case elemWithHttp => elemWithHttp
}