nmu*_*thy 3 functional-programming scala scala-collections apache-spark
我有一个映射器函数定义如下:
def foo(x:Int) = if (x>2) x*2
Run Code Online (Sandbox Code Playgroud)
这种方法的类型签名是Int => AnyVal.现在,如果我将此函数映射到整数列表:
scala> List(-1,3,-4,0,5).map(foo)
res0: List[AnyVal] = List((), 6, (), (), 10)
Run Code Online (Sandbox Code Playgroud)
我需要一种Unit从Ints 中过滤掉s 的方法:
scala> res0.filter(_.isInstanceOf[Int]).map(_.asInstanceOf[Int])
res1: List[Int] = List(6, 10)
Run Code Online (Sandbox Code Playgroud)
一切似乎都精确表达,直到我必须做的过滤器,地图上res0提取我关心的值.我可以使用matchers或if-else in foo来确保我返回一个Int但是我仍然需要过滤由map操作产生的不需要的值.
任何经过良好调查的Scala开发人员都能阅读这篇文章,可以更深入地了解这种方法的好坏,特别是当我的馆藏变得越来越大时(例如,这个集合可能是分布式Spark RDD)吗?在功能上有更多惯用的方法吗?
在这种情况下,如果您需要删除小于2的所有整数,我建议您使用带PartialFunction的collect
val foo: PartialFunction[Int, Int] = {
case x if x > 2 => x*2
}
println(List(-1,3,-4,0,5).collect(foo))
Run Code Online (Sandbox Code Playgroud)
您的原始foo具有Int => AnyVal类型,因为scalac会将其转换为类似的内容
def foo(x: Int) = if (x > 2) x*2 else () // () === Unit
Run Code Online (Sandbox Code Playgroud)
Int和Unit的常见超类型是AnyVal