我有一张简单的地图
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
我在这里做些傻事我确定,为什么不是'这个编译?
答案 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