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

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)
}

(编辑:李大同)

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

    推荐文章
      热点阅读