为什么我的地图不能使用过滤器?

时间:2012-03-03 13:50:12

标签: scala dictionary collections types filter

当我尝试执行以下操作时,我在Scala中遇到奇怪的类型不匹配错误:

val m = Map[String, Int]("a" -> 1, "b" -> 2, "c" -> 3)
val n = Map[String, Int]("c" -> 3, "d" -> 4, "e" -> 5)
n.filter((k: String, v: Int) => !m.contains(k))
<console>:10: error: type mismatch;
 found   : (String, Int) => Boolean
 required: (String, Int) => Boolean
              n.filter((k: String, v: Int) => !m.contains(k))

我做错了吗?类型不匹配在这里没有意义。

3 个答案:

答案 0 :(得分:14)

实际需要的类型是((String,Int)),即单个参数是Pair[String,Int],但您的语法是传递两个单独的参数。您可以传入部分函数,​​该函数使用case关键字匹配对:

n.filter { case(k, v) => !m.contains(k) }

这里有一个Relevant article

Luigi值得道具指出filterKeys是一种更适合在这里使用的方法。

答案 1 :(得分:9)

无用的错误消息是Scala 2.9中的已知错误。

应该说的是

 found   : (String, Int) => Boolean
 required: ((String, Int)) => Boolean

即。当Function2[String, Int, Boolean]需要filter时,您已提供Function1[(String, Int), Boolean]

您可以使用模式匹配来匹配Nick显示的元组,直接提供Tomasz显示的元组功能,或者您可以使用{{1}将Function2转换为Function1获取元组方法:

tupled

但是你最好使用内置的n.filter(((k: String, v: Int) => !m.contains(k)).tupled) // or n.filter(Function.tupled((k, v) => !m.contains(k))) 方法:

filterKeys

答案 2 :(得分:4)

试试这个:

n.filter(entry => !m.contains(entry._1))

其中entry是包含(key, value)的元组,因此entry._1是关键。