scala – 映射Map的单个条目
发布时间:2020-12-16 09:56:35 所属栏目:安全 来源:网络整理
导读:我希望实现以下内容: (_ : Map[K,Int]).mapKey(k,_ + 1) 并且mapKey函数仅将其第二个参数(Int = Int)应用于存储在k下的值.标准库中有什么东西吗?如果不是我打赌Scalaz中有什么东西. 当然我可以自己编写这个函数(m.updated(k,f(m(k))),这很简单.但是我已经
我希望实现以下内容:
(_ : 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) 可能没用.我只是张贴参考. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |