Scala 删除可变状态和if语句

Scala 删除可变状态和if语句,scala,Scala,下面的代码返回页面中的所有链接。 代码被简化为只公开我试图实现的改进。 如何删除hrefStringListBuffer&href周围的可变状态并使用惯用Scala val hrefList = List("href1" , "href2") val url = "testUrl" var hrefStringListBuffer = new scala.collection.mutable.ListBuffer[String]() for (l <- hrefList)

下面的代码返回页面中的所有链接。 代码被简化为只公开我试图实现的改进。 如何删除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))

但是如何用支票来满足Starts的需求呢

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

val lb = hrefList.map { l =>
  val href = getHref(l)
  if (href.startsWith("http"))
    href
  else
    getDomainName(url) + "/" + href
}
i、 e.正文中的
href
可以是
val
,您可以返回它,也可以返回
getDomainName
构造的结果


顺便说一句,
lb
本身就是一个不可变的
列表
。不需要可变构造作为此过程的任何部分。

使用
map
over
hrefList

val hrefList: List[String] = // ...
val hrefString: List[String] = hrefList.map { l =>
  val get = getHref(l)
  if (get.startsWith("http")) {
    get
  } else {
    getDomainName(url) + "/" + get
  }
}

我会使用地图和收集:

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

在理解中,添加
href=getHref(l)
而不是
var href=getHref(l)
(href取决于每个
l
),并生成
href
的列表

val hrefStringListBuffer =
  for (l <- hrefList; href = getHref(l)) 
  yield { 
    if (href.startsWith("http")) href
    else getDomainName(url) + "/" + href
  }

我不知道
Scala
,但是你能在
map
之前做一个过滤器吗?作为关于第二个代码块的一般说明,在这个代码块中,你使用map附加到ListBuffer:map只用于它的副作用,这是相当不自然的。考虑使用OFF语句或FROACH(不在这种情况下,但一般情况下只需要副作用)。这是不一样的。原件维护列表中的元素数量。如在代码的第一部分,我们可以找到<代码>如果(.HRF.StastTube(“http”))。我认为我们应该将其转换为一个过滤器。如果条件返回
false
,则原始的过滤器会在结果列表中添加一个元素,而您的过滤器会丢弃它。
val hrefStringListBuffer =
  for (l <- hrefList; href = getHref(l)) 
  yield { 
    if (href.startsWith("http")) href
    else getDomainName(url) + "/" + href
  }
hrefStringListBuffer.foreach(println)