集合中AnyVals的最佳FP成语

时间:2014-11-01 19:51:38

标签: scala functional-programming apache-spark scala-collections

我有一个映射器函数定义如下:

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 )?在功能上有更多惯用的方法吗?

1 个答案:

答案 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