昨天我在SO:scala List map vs mapConserve
找到了关于scala mapConserve的信息我的问题是,有人想什么时候使用这种方法?提供的示例使用带有标识功能的mapConserve,我看不到它的用例......
编辑对GitHub进行了快速搜索,找到了使用mapConserve的816个Scala代码块。其中许多(至少3页)是这段代码:
def checkStackOverflow() = {
var xs: List[String] = Nil
for (i <- 0 until 250000)
xs = "X" :: xs
val lowers = xs.mapConserve(_.toLowerCase)
assert(xs.mapConserve(x => x) eq xs)
}
答案 0 :(得分:3)
这个问题引起了我的兴趣,所以我浏览了Scala代码库并查看了mapConserves()
实际用途。
在一些地方弹出的是:如果参数是部分函数,则轻松跟踪地图操作是否已经进行了实际更改(通过简单的参考检查),如Erasure中的示例所示:
def squashBoxed(tp: Type): Type = tp.dealiasWiden match {
case t @ RefinedType(parents, decls) =>
val parents1 = parents mapConserve squashBoxed
if (parents1 eq parents) tp
else RefinedType(parents1, decls)
// ...
如果没有执行实际更改,则代码可以防止之后运行某种昂贵的操作。
具有常规map()
的该用例的替代方案是..
map()
的部分函数内跟踪是否通过改变某种外部标记进行更改 - &gt;副作用,不是纯粹的,不是功能性的做事方式;一般而言,imho非常丑陋[1]在特定情况下这是否显着取决于当然,在您优化之前,通常会有疑问。一般来说,这种方法现在似乎较少使用,这可能是一种通常并不重要的赠品。