chu*_*lor 4 lambda scala function
我试图在scala中过滤从字符串到int的映射,我遇到了一个奇怪的问题.
如果我将以下内容放入REPL:
scala> val myMap = Map("a" -> 1, "b" -> 2, "c" -> 3)
myMap: scala.collection.immutable.Map[java.lang.String,Int] =
| Map(a -> 1, b -> 2, c -> 3)
Run Code Online (Sandbox Code Playgroud)
到目前为止还可以,这有效......
scala> myMap.filter(_._2 > 1)
res9: scala.collection.immutable.Map[java.lang.String,Int] = Map(b -> 2, c -> 3)
Run Code Online (Sandbox Code Playgroud)
但这失败了......
scala> myMap.filter((k:java.lang.String, v:Int) => v > 1)
<console>:9: error: type mismatch;
found : (java.lang.String, Int) => Boolean
required: ((java.lang.String, Int)) => Boolean
myMap.filter((k:java.lang.String, v:Int) => v > 1)
Run Code Online (Sandbox Code Playgroud)
我的问题是错误信息和一对额外的括号是怎么回事?如果我尝试添加一组额外的括号,我会收到错误:不是合法的形式参数.
Kip*_*ros 16
myMap.filter期望类型的函数,Tuple2[String, Int] => Boolean相当于((String, Int)) => Boolean.你传递的是类型的函数(String, Int) => Boolean; 也就是说,一个带两个参数而不是一个参数的函数Tuple2.
让它发挥作用的两种方法:
myMap.filter { case (k, v) => v > 1 }
Run Code Online (Sandbox Code Playgroud)
和
myMap.filter(Function.tupled((k, v) => v > 1))
Run Code Online (Sandbox Code Playgroud)
第一个通过模式匹配工作,第二个通过将函数转换(String, Int) => Boolean为((String, Int)) => Boolean.
顺便说一下,有关统一元组和函数参数列表的讨论.也许在Scala的未来版本中,所有函数都将采用单个参数(可能是一个元组).
filter接受只接受一个参数的函数.在表达式中,表达式接受两个参数.但是,元素碰巧是一对,所以你可能认为你可以给出两个参数.正确的方式是这样的:
myMap.filter (p => p._2 > 1)
Run Code Online (Sandbox Code Playgroud)
也就是说,我收到一对,p它的第二个元素必须大于1.