将流值添加到Scala中的现有映射

将流值添加到Scala中的现有映射,scala,dictionary,scala-collections,Scala,Dictionary,Scala Collections,我有一个带有一些计算值的映射,在从流中读取的过程中,我想根据一些条件将它的一些(键,值)放到这个映射中 我如何用一个简洁的代码来实现它 我是这样想的: var newcards = scala.collection.mutable.Map[String, String]() var allCards = scala.collection.mutable.Map[String, String]() ... newCards.filter(some_condition).append((k:Stri

我有一个带有一些计算值的映射,在从流中读取的过程中,我想根据一些条件将它的一些(键,值)放到这个映射中

我如何用一个简洁的代码来实现它

我是这样想的:

var newcards = scala.collection.mutable.Map[String, String]()
var allCards = scala.collection.mutable.Map[String, String]()
...
newCards.filter(some_condition).append((k:String, v:String) => allCards.put(k, v))
// append method is not present

您不需要使用可变映射。如果你没有其他选择。更喜欢使用TrieMap。它是并发的,将允许您修改映射

scala> import scala.collection.concurrent.TrieMap
import scala.collection.concurrent.TrieMap

scala> val m1= TrieMap[Int, String](1 -> "I", 2 -> "am", 3 -> "TrieMap", 4 -> "Let", 5 -> "you", 6 -> "modify")
m1: scala.collection.concurrent.TrieMap[Int,String] = TrieMap(1 -> I, 5 -> you, 2 -> am, 6 -> modify, 3 -> TrieMap, 4 -> Let)

scala> val m2= TrieMap[String, String]()
m2: scala.collection.concurrent.TrieMap[String,String] = TrieMap()

scala> m1.filter(_._1 % 2 == 0).foreach {
     |   case (key, value) => m2(key.toString) = value
     | }

scala> m2
res1: scala.collection.concurrent.TrieMap[String,String] = TrieMap(4 -> Let, 2 -> am, 6 -> modify)

您不需要使用可变映射。如果你没有其他选择。更喜欢使用TrieMap。它是并发的,将允许您修改映射

scala> import scala.collection.concurrent.TrieMap
import scala.collection.concurrent.TrieMap

scala> val m1= TrieMap[Int, String](1 -> "I", 2 -> "am", 3 -> "TrieMap", 4 -> "Let", 5 -> "you", 6 -> "modify")
m1: scala.collection.concurrent.TrieMap[Int,String] = TrieMap(1 -> I, 5 -> you, 2 -> am, 6 -> modify, 3 -> TrieMap, 4 -> Let)

scala> val m2= TrieMap[String, String]()
m2: scala.collection.concurrent.TrieMap[String,String] = TrieMap()

scala> m1.filter(_._1 % 2 == 0).foreach {
     |   case (key, value) => m2(key.toString) = value
     | }

scala> m2
res1: scala.collection.concurrent.TrieMap[String,String] = TrieMap(4 -> Let, 2 -> am, 6 -> modify)

这里有一种使用不可变映射的方法。我不知道您的流是什么样子的,但也许可以根据您的需要进行更改:

object Example {
  def update[K, V](m: Map[K, V])(s: Stream[(K, V)]): Map[K, V] = s match {
    case (k, v) #:: kvs => update(m.updated(k, v))(kvs)
    case _              => m
  }

  def main(args: Array[String]): Unit = {
    val s1 = Stream(("b", "2"), ("c", "3"))
    val s2 = Stream(("a", "100"))
    val m  = Map("a" -> "1")

    println(update(m)(s1)) //appends
    println(update(m)(s2)) //replaces
  }
}
Main打印出以下内容:

Map(a -> 1, b -> 2, c -> 3)
Map(a -> 100)

这里有一种使用不可变映射的方法。我不知道您的流是什么样子的,但也许可以根据您的需要进行更改:

object Example {
  def update[K, V](m: Map[K, V])(s: Stream[(K, V)]): Map[K, V] = s match {
    case (k, v) #:: kvs => update(m.updated(k, v))(kvs)
    case _              => m
  }

  def main(args: Array[String]): Unit = {
    val s1 = Stream(("b", "2"), ("c", "3"))
    val s2 = Stream(("a", "100"))
    val m  = Map("a" -> "1")

    println(update(m)(s1)) //appends
    println(update(m)(s2)) //replaces
  }
}
Main打印出以下内容:

Map(a -> 1, b -> 2, c -> 3)
Map(a -> 100)

allCards=allCards++newcards.filter(condition)
重复键下的值将被覆盖,您确实不应该使用可变变量。是否要为特定键添加一些键、值对或仅添加值?@ramammishra add key+value@jwvh谢谢我正想找一艘客轮。在链式调用(不是赋值)中有没有同样的方法,只是“收集到”语义;您的意思是:
newcards.filter(condition).foreach((allCards.update..tuple)
?(啊,所有这些可变的。我必须去洗手。)
allCards=allCards++newcards.filter(condition)
重复键下的值将被覆盖,你真的不应该使用可变变量。你想为特定键添加一些键、值对还是只添加值?@ramammishra add key+value@jwvh谢谢我正想找一艘客轮。在链式调用(不是赋值)中有没有同样的方法,只是“收集到”语义;您的意思是:
newcards.filter(condition).foreach((allCards.update..tuple)
?(啊,所有这些东西。我得去洗手了。)