我有一个包含一些计算值的Map,在从Stream读取数据时,我想根据某些条件将其中的一些(键,值)放入此Map。
如何用简短的代码实现它?
我在想这样的事情:
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
答案 0 :(得分:2)
这是处理不可变地图的一种方法。我不知道您的视频流是什么样子,但是也许可以根据您的需要进行更改:
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)
答案 1 :(得分:1)
您不需要使用可变地图。如果没有其他选择。优先使用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)