Scala地图:如何添加新条目

时间:2019-02-13 16:13:20

标签: scala immutability

我已将scala地图创建为:

val A:Map[String, String] = Map()

然后我尝试将条目添加为:

val B = AttributeCodes.map { s =>

    val attributeVal:String = <someString>
    if (!attributeVal.isEmpty)
    {
      A + (s -> attributeVal)
    }
    else
      ()
  }

在这部分代码之后,我看到A仍然为空。而且,B是类型:

Pattern: B: IndexedSeq[Any]

我需要一个映射来添加条目,并且需要相同或不同的映射以作为回报,以便稍后在代码中使用。但是,我不能为此使用“ var”。对这个问题以及如何解决这个问题有任何见解?

2 个答案:

答案 0 :(得分:4)

Scala在许多情况下使用不变性,并鼓励您这样做。

请勿创建空白地图,请使用Map[String, String].map创建一个.filter

val A = AttributeCodes.map { s =>
      val attributeVal:String = <someString>
      s -> attributeVal
}.toMap.filter(e => !e._1.isEmpty && !e._2.isEmpty)

答案 1 :(得分:2)

在Scala中,默认的Map类型是不可变的。 <Map> + <Tuple>使用添加的其他条目创建新的地图实例。

有两种解决方法:

  1. 改为使用scala.collection.mutable.Map

    val A:immutable.Map[String, String] = immutable.Map()
    
    AttributeCodes.forEach { s =>
      val attributeVal:String = <someString>
      if (!attributeVal.isEmpty){
        A.put(s, attributeVal)
      }
    }
    
  2. 使用折叠在不可变地图中创建:

    val A: Map[String,String] = AttributeCodes.foldLeft(Map(), { m, s =>
      val attributeVal:String = <someString>
      if (!attributeVal.isEmpty){
        m + (s -> attributeVal)
      } else {
        m
      }
    }