将filterNot与地图

时间:2016-10-04 17:23:28

标签: scala

我有一张简单的地图

val m = Map("a1" -> "1", "b2" -> "2", "c3" -> "3")
val someList = List("b", "d")
m.filterNot( (k,v) => someList.exist(l => k.startsWith(l)) )

我收到错误:

error: missing parameter type

我在这里做些傻事我确定,为什么不是'这个编译?

3 个答案:

答案 0 :(得分:4)

从元组中提取filterNot时,

case需要{}个关键字和k, v

请注意,它不是exist exists

m.filterNot { case (k,v) => someList.exists(l => k.startsWith(l)) }

m.filterNot(pair => someList.exists(l => pair._1.startsWith(l)))

说明

当您使用提取器语法从元组中提取k,v时,您必须使用case关键字和{}

如果没有提取器语法,您可以

m.filterNot(pair => someList.exists(l => pair._1.startsWith(l)))

Scala REPL

scala> val m = Map("a1" -> "1", "b2" -> "2", "c3" -> "3")
m: scala.collection.immutable.Map[String,String] = Map(a1 -> 1, b2 -> 2, c3 -> 3)

scala> val someList = List("b", "d")
someList: List[String] = List(b, d)

scala>  m.filterNot { case (k,v) => someList.exists(l => k.startsWith(l)) }
res15: scala.collection.immutable.Map[String,String] = Map(a1 -> 1, c3 -> 3)

没有提取器语法

现在您不需要使用case关键字和{},因为我们没有使用提取器语法提取密钥和值

scala> m.filterNot(pair => someList.exists(l => pair._1.startsWith(l)))
res18: scala.collection.immutable.Map[String,String] = Map(a1 -> 1, c3 -> 3)

scala> val m = Map("a1" -> "1", "b2" -> "2", "c3" -> "3")
m: scala.collection.immutable.Map[String,String] = Map(a1 -> 1, b2 -> 2, c3 -> 3)

scala> val someList = List("b", "d")
someList: List[String] = List(b, d)

scala> m.filterNot(pair => someList.exists(l => pair._1.startsWith(l)))
res19: scala.collection.immutable.Map[String,String] = Map(a1 -> 1, c3 -> 3)

答案 1 :(得分:2)

问题是:filterNot方法接受一个参数,而您正在定义两个参数的列表。这会混淆编译器,结果就是该消息。

为了解决这个问题,您可以使用以下语法(注意使用与case关键字匹配的模式):

m.filterNot { case (k,v) => someList.exist(l => k.startsWith(l)) }

使用这样的模式匹配会创建一个PartialFunction,它将分解键和值,并像普通函数一样应用于Map

答案 2 :(得分:1)

用于理解语法,提取和过滤可以如下实现,

for ( pair@(k,v) <- m; l <- someList if !k.startsWith(l)) yield pair