scala - 按键集过滤 map

标签 scala

是否有过滤 Map 的快捷方式,仅保留给定 Set 中包含键的条目?

这是一些示例代码

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,Int] = Map(1 -> 1, 2 -> 2)

我正在寻找比这更短的东西。

最佳答案

回答问题

您可以利用以下事实:Set[A]是谓词;即 A => Boolean

map filterKeys set

这是在工作:
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> 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,Int] = Map(1 -> 1, 2 -> 2)

或者,如果您更喜欢:
scala> map filterKeys Set("1", "2")
res1: scala.collection.immutable.Map[java.lang.String,Int] = Map(1 -> 1, 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,Int] = Map(1 -> 1, 2 -> 2, 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)
}

关于scala - 按键集过滤 map ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9031023/

相关文章:

scala - 登录 Akka 时如何缩写 ActorRef 的路径?

java - 环绕具有不同签名的通用回调函数

java - 如何从 Java 中的 Java 列表创建 scala.collection.immutable.Seq?

scala - 使用 vim 编辑 scala 时跳转到源代码

scala - 如何在 IntelliJ IDEA 中配置 Scala 代码风格

scala - 如何在 IntelliJ IDEA 中创建 Spark/Scala 项目(无法解析 build.sbt 中的依赖项)?

scala - 如何在 Spark 窗口函数中使用 orderby() 降序排列?

scala - 为什么 Scala 标准库中的 `Numeric` 没有 `maxValue` ?

scala - 带有 scala 宏的非 scala 源位置

parsing - Scala-具有查询字符串解析器和Builder DSL的URL