Scala 使用immutable.ListMap代替mutable.LinkedHashMap

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] =

我希望尽可能多地使用不可变的数据结构。 在我们的代码库中,非常普遍的情况是使用mutable.LinkedHashMap。我想在所有非性能关键代码中用immutable.ListMap替换它

我们的代码所采用的通用格式

  • mutable.LinkedHashMap初始化
  • 循环条件
  • 根据某些条件在LinkedHashMap中添加元素
  • 循环后,返回LinkedHashMap
  • 示例代码:

    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")
     }