加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读