scala – 收藏中AnyVals的最佳FP习语
发布时间:2020-12-16 09:07:18 所属栏目:安全 来源:网络整理
导读:我有一个映射器函数定义如下: def foo(x:Int) = if (x2) x*2 该方法的类型签名是Int = AnyVal.现在,如果我将此函数映射到整数列表: scala List(-1,3,-4,5).map(foo)res0: List[AnyVal] = List((),6,(),10) 我需要一种从Ints中过滤掉单位的方法,如下所示:
我有一个映射器函数定义如下:
def foo(x:Int) = if (x>2) x*2 该方法的类型签名是Int => AnyVal.现在,如果我将此函数映射到整数列表: scala> List(-1,3,-4,5).map(foo) res0: List[AnyVal] = List((),6,(),10) 我需要一种从Ints中过滤掉单位的方法,如下所示: scala> res0.filter(_.isInstanceOf[Int]).map(_.asInstanceOf[Int]) res1: List[Int] = List(6,10) 在我必须在res0上执行filter-map以提取我关心的值之前,所有内容似乎都简明扼要地表达出来.我可以在foo中使用matchers或if-else来始终确保我返回Int但我仍然需要过滤由map操作产生的不需要的值. 任何经过良好调查的Scala开发人员都能阅读这篇文章,可以更深入地了解这种方法的好坏,尤其是当我的集合变得越来越大时(例如,这个集合可能是分布式Spark RDD)?在功能上有更多惯用的方法吗? 解决方法
在这种情况下,如果您需要删除小于2的所有整数,我建议您使用带有PartialFunction的collect
val foo: PartialFunction[Int,Int] = { case x if x > 2 => x*2 } println(List(-1,5).collect(foo)) 您的原始foo类型为Int => AnyVal,因为scalac将其转换为类似的东西 def foo(x: Int) = if (x > 2) x*2 else () // () === Unit Int和Unit的常见超类型是AnyVal (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |