Scala 删除可变状态和if语句
下面的代码返回页面中的所有链接。 代码被简化为只公开我试图实现的改进。 如何删除hrefStringListBuffer&href周围的可变状态并使用惯用ScalaScala 删除可变状态和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)
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
overhrefList
:
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)