scala – 按键设置过滤地图
发布时间:2020-12-16 09:47:21 所属栏目:安全 来源:网络整理
导读:是否有一个快捷方式来过滤只保存给定集中包含键的条目的地图? 这里是一些示例代码 scala val map = Map("1"-1,"2"-2,"3"-3)map: scala.collection.immutable.Map[java.lang.String,Int] = Map(1 - 1,2 - 2,3 - 3)scala map.filterKeys(Set("1","2").contain
是否有一个快捷方式来过滤只保存给定集中包含键的条目的地图?
这里是一些示例代码 scala> val map = Map("1"->1,"2"->2,"3"->3) map: scala.collection.immutable.Map[java.lang.String,Int] = Map(1 -> 1,2 -> 2,3 -> 3) scala> map.filterKeys(Set("1","2").contains) res0: scala.collection.immutable.Map[java.lang.String,2 -> 2) 我正在寻找比这更短的东西。 解决方法
回答问题
你可以利用Set [A]是谓词的事实;即A =布尔值 map filterKeys set 这里是在工作: scala> val map = Map("1" -> 1,"2" -> 2,"3" -> 3) map: scala.collection.immutable.Map[java.lang.String,3 -> 3) scala> val set = Set("1","2") set: scala.collection.immutable.Set[java.lang.String] = Set(1,2) scala> map filterKeys set res0: scala.collection.immutable.Map[java.lang.String,2 -> 2) 或者如果您喜欢: scala> map filterKeys Set("1","2") res1: scala.collection.immutable.Map[java.lang.String,2 -> 2) 谓语 它实际上是有用的有一个谓词的包装。像这样: scala> class PredicateW[A](self: A => Boolean) { | def and(other: A => Boolean): A => Boolean = a => self(a) && other(a) | def or(other: A => Boolean): A => Boolean = a => self(a) || other(a) | def unary_! : A => Boolean = a => !self(a) | } defined class PredicateW 和一个隐式转换: scala> implicit def Predicate_Is_PredicateW[A](p: A => Boolean) = new PredicateW(p) Predicate_Is_PredicateW: [A](p: A => Boolean)PredicateW[A] 然后你可以使用它: scala> map filterKeys (Set("1","2") and Set("2","3")) res2: scala.collection.immutable.Map[java.lang.String,Int] = Map(2 -> 2) scala> map filterKeys (Set("1","2") or Set("2","3")) res3: scala.collection.immutable.Map[java.lang.String,3 -> 3) scala> map filterKeys !Set("2","3") res4: scala.collection.immutable.Map[java.lang.String,Int] = Map(1 -> 1) 这可以扩展到xor,nand等等,如果你包括符号unicode可以令人惊讶地可读代码: val mustReport = trades filter (uncoveredShort ∨ exceedsDollarMax) val european = { val Europe = (_ : Market).exchange.country.region == Region.EU trades filter (_.market ∈: Europe) } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |