考虑以下:
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
只是因为它是我在我的真实代码中使用的数据结构(尽管还有其他数据:))