scala匿名函数问题
发布时间:2020-12-16 18:26:52 所属栏目:安全 来源:网络整理
导读:我试图在 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) 到目前为止还可
我试图在
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) 到目前为止还可以,这有效…… scala> myMap.filter(_._2 > 1) res9: scala.collection.immutable.Map[java.lang.String,Int] = Map(b -> 2,c -> 3) 但这失败了…… 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) 我的问题是错误信息和一对额外的括号是怎么回事?如果我尝试添加一组额外的括号,我会收到错误:不是合法的形式参数. 解决方法
myMap.filter需要类型为Tuple2 [String,Int] =>的函数.布尔值,相当于((String,Int))=>布尔.你传递的函数类型为(String,Int)=>布尔;也就是说,一个函数接受两个参数而不是一个Tuple2.
让它发挥作用的两种方法: myMap.filter { case (k,v) => v > 1 } 和 myMap.filter(Function.tupled((k,v) => v > 1)) 第一个通过模式匹配工作,第二个通过转换函数(String,Int)=> Boolean to((String,Int))=>布尔. 顺便说一句,有关于统一元组和函数参数列表的讨论.也许在Scala的未来版本中,所有函数都将采用单个参数(可能是一个元组). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |