我有一个映射器函数定义如下:
def foo(x:Int) = if (x>2) x*2
此方法的类型签名为Int => AnyVal
。现在,如果我将此函数映射到整数列表:
scala> List(-1,3,-4,0,5).map(foo)
res0: List[AnyVal] = List((), 6, (), (), 10)
我需要一种过滤掉Unit
的{{1}} s的方法,如下所示:
Int
在我必须在scala> res0.filter(_.isInstanceOf[Int]).map(_.asInstanceOf[Int])
res1: List[Int] = List(6, 10)
上执行 filter-map 以提取我关心的值之前,所有内容似乎都简明扼要地表达出来。我可以在res0
中使用 matchers 或 if-else 来始终确保我返回foo
,但我仍然需要过滤地图操作产生的不需要的值。
任何经验丰富的Scala开发人员都可以阅读这篇文章,进一步了解这种方法的好坏,特别是当我的馆藏变大时(例如,这个集合可能是分布式Spark Int
)?在功能上有更多惯用的方法吗?
答案 0 :(得分:7)
在这种情况下,如果你需要删除所有小于2的整数,我建议你使用part with PartialFunction
val foo: PartialFunction[Int, Int] = {
case x if x > 2 => x*2
}
println(List(-1,3,-4,0,5).collect(foo))
您的原始foo类型为Int => AnyVal,因为scalac将其转换为类似
的内容def foo(x: Int) = if (x > 2) x*2 else () // () === Unit
和Int和Unit的常见超类型是AnyVal