加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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的未来版本中,所有函数都将采用单个参数(可能是一个元组).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读