运维开发网

scala – 映射Map的单个条目

运维开发网 https://www.qedev.com 2020-07-07 10:03 出处:网络 作者:运维开发网整理
我希望实现以下内容: (_ : Map[K,Int]).mapKey(k, _ + 1) 并且mapKey函数仅将其第二个参数(Int => Int)应用于存储在k下的值.标准库中有什么东西吗?如果不是我打赌Scalaz中有什么东西. 当然我可以自己编写这个函数(m.updated(k,f(m(k))),这很简单.但是我已经多次遇到这个问题,所以也许它已经完成了? 对于Scalaz,我想象下面的代
我希望实现以下内容:

(_ : Map[K,Int]).mapKey(k, _ + 1)

并且mapKey函数仅将其第二个参数(Int => Int)应用于存储在k下的值.标准库中有什么东西吗?如果不是我打赌Scalaz中有什么东西.

当然我可以自己编写这个函数(m.updated(k,f(m(k))),这很简单.但是我已经多次遇到这个问题,所以也许它已经完成了?

对于Scalaz,我想象下面的代码:

(m: Map[A,B]).project(k: A).map(f: B => B): Map[A,B]
你当然可以添加

def changeForKey[A,B](a: A, fun: B => B): Tuple2[A, B] => Tuple2[A, B] = { kv =>
  kv match {
    case (`a`, b) => (a, fun(b))
    case x => x
  }
}

val theMap = Map('a -> 1, 'b -> 2)
theMap map changeForKey('a, (_: Int) + 1)
res0: scala.collection.immutable.Map[Symbol,Int] = Map('a -> 2, 'b -> 2)

但这会绕过关于内存重用和访问的任何优化.

我使用拉链为你提出的项目方法提出了一个相当冗长和低效的scalaz解决方案:

theMap.toStream.toZipper.flatMap(_.findZ(_._1 == 'a).flatMap(elem => elem.delete.map(_.insert((elem.focus._1, fun(elem.focus._2)))))).map(_.toStream.toMap)

要么

(for {
  z <- theMap.toStream.toZipper
  elem <- z.findZ(_._1 == 'a)
  z2 <- elem.delete
} yield z2.insert((elem.focus._1, fun(elem.focus._2)))).map(_.toStream.toMap)

可能没用.我只是张贴参考.

0

精彩评论

暂无评论...
验证码 换一张
取 消