【问题标题】:Add stream values to existing Map in Scala将流值添加到 Scala 中的现有 Map
【发布时间】:2019-05-28 21:27:51
【问题描述】:

我有一个包含一些计算值的 Map,在从 Stream 读取期间,我想根据某些条件将其中的一些(键、值)放入此映射。

如何用简洁的代码实现它?

我在想这样的事情:

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

【问题讨论】:

  • allCards = allCards ++ newcards.filter(condition) 重复键下的值将被覆盖,你真的不应该使用可变变量。
  • 您要添加一些键、值对还是只为特定键添加值?
  • @RamanMishra 添加键+值
  • @jwvh 谢谢!我正在寻找一些单线。有没有办法在链式调用中做同样的事情(不是赋值),只是“收集到”语义?
  • @AlexStamper;你的意思是这样的:newcards.filter(condition).foreach((allCards.update _).tupled)? (呃,所有这些变量。我得去洗手了。)

标签: scala dictionary scala-collections


【解决方案1】:

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

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)

【讨论】:

    【解决方案2】:

    您不需要使用可变映射。如果你没有其他选择。更喜欢使用 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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-07
      • 2019-11-16
      • 2012-06-14
      • 2017-01-23
      • 1970-01-01
      • 2016-03-05
      • 2011-07-10
      相关资源
      最近更新 更多