Scala 使用immutable.ListMap代替mutable.LinkedHashMap
我希望尽可能多地使用不可变的数据结构。 在我们的代码库中,非常普遍的情况是使用mutable.LinkedHashMap。我想在所有非性能关键代码中用immutable.ListMap替换它 我们的代码所采用的通用格式Scala 使用immutable.ListMap代替mutable.LinkedHashMap,scala,functional-programming,Scala,Functional Programming,我希望尽可能多地使用不可变的数据结构。 在我们的代码库中,非常普遍的情况是使用mutable.LinkedHashMap。我想在所有非性能关键代码中用immutable.ListMap替换它 我们的代码所采用的通用格式 mutable.LinkedHashMap初始化 循环条件 根据某些条件在LinkedHashMap中添加元素 循环后,返回LinkedHashMap 示例代码: def dummyFunction(): mutable.LinkedHashMap[Int, String] =
def dummyFunction(): mutable.LinkedHashMap[Int, String] = {
val tmpListMap: mutable.LinkedHashMap[Int, String] = mutable.LinkedHashMap()
for (i <- 1 to 10) {
if (i%2 ==0) tmpListMap += (i -> "even")
else tmpListMap += (i -> "odd")
}
tmpListMap
}
def dummyFunction():可变的.LinkedHashMap[Int,String]={
val tmpListMap:mutable.LinkedHashMap[Int,String]=mutable.LinkedHashMap()
因为(我“甚至”)
else tmpListMap+=(i->“奇数”)
}
tmpListMap
}
我想在所有这些地方使用ListMap。我不想再次循环tmpListMap来创建ListMap
Scala版本:2.11您不知道如何返回不可变的映射,因为创建后无法修改它?这就是问题所在吗? 很多方面。例如:
(1 to 10).map {
case x if x%2 == 0 => (x -> "even")
case x => (x -> "odd")
}.toMap
上面返回的是常规的映射
,而不是列表映射
。我不知道你为什么想要后者,但是,如果你出于某种原因想要的话,那就更复杂了:
val tuples = (1 to 10).map {
case x if x%2 == 0 => (x -> "even")
case x => (x -> "odd")
}
ListMap(tuples:_*)
是的,你也可以从a中让步以获得理解(我不确定你为什么会在这种情况下这样做),如下所示:
val tuples = for {
x <- 1 to 10
kind = if (x %2 == 0) "even" else "odd"
} yield (x -> kind)
或者只是:
ListMap(
(1 to 10).map {
case x if x%2 == 0 => x -> "even"
case x => x -> "odd"
}:_*
)
还有一个.foldLeft
,它允许您以一种与当前最相似的方式编写它,即它逐渐累积地图中的变化,而不是在最后进行一次转换。。。虽然不确定您为什么希望这样,但这是效率最低的方法:
(1 to 10).foldLeft(ListMap.empty[Int, String]) {
case (x, map) if x%2 == 0 => map.updated(x, "even")
case (x, map) => map.updated(x, "odd")
}
那么问题是什么呢?我关心的是从任何方法中重新调整可变数据结构。我试图限制变量的“可变性”范围,听起来不错!问题是什么?@Dima我想将方法签名更改为def dummyFunction():immutable.ListMap[Int,String]。如果我能完全取消mutable.LinkedHashMap,那就太好了。我在for循环中看到了神奇的收益,它以scalaYes的形式返回不可变集合,您可以从循环中收益。您可以返回不可变的集合。感谢Dima,您是对的,我不知道如何从yield返回ListMap。但我知道:)
(1 to 10).foldLeft(ListMap.empty[Int, String]) {
case (x, map) if x%2 == 0 => map.updated(x, "even")
case (x, map) => map.updated(x, "odd")
}