Scala数据结构:操作链(如mapValues,filter …)和中间结果
发布时间:2020-12-16 10:08:26 所属栏目:安全 来源:网络整理
导读:考虑以下: val stuff = Map[String,Int]("apple" - 5,"orange" - 1,"banana" - 3,"kiwi" - 2)val used = 1val rest = stuff.mapValues{ case quantity = quantity - used}.filterNot{ case (fruit,quantity) = quantity == 0} 结果是 rest : scala.collecti
考虑以下:
val stuff = Map[String,Int]("apple" -> 5,"orange" -> 1,"banana" -> 3,"kiwi" -> 2) val used = 1 val rest = stuff.mapValues{ case quantity => quantity - used }.filterNot{ case (fruit,quantity) => quantity == 0 } 结果是 rest : scala.collection.immutable.Map[String,Int] = Map(apple -> 4,banana -> 2,kiwi -> 1) 虽然我不是Scala的专家,但我知道该语言并不是懒惰的(与Haskell不同),因此mapValues将生成一个中间Map,而后者将作为输入传递给filterNot(如果还有其他操作在链中). 如何避免这种无用的中间数据结构? 注意:我理解这个问题可以推广到其他数据结构.这里我使用的是Map,因为它是我在实际代码中使用的数据结构(尽管有其他数据:)) 解决方法
这似乎可以解决问题:
object ChainOpsRS { val stuff = Map[String,"kiwi" -> 2) val used = 1 val rest = stuff.collect { case (fruit,quantity) if quantity > used => (fruit,quantity - used) } def main(args: Array[String]) { printf("stuff=%s%n",stuff.mkString("{",","}")) printf(" rest=%s%n",rest.mkString("{","}")) } } 运行时会产生以下输出: stuff={apple -> 5,orange -> 1,banana -> 3,kiwi -> 2} rest={apple -> 4,kiwi -> 1} (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |