集合中AnyVals的最佳FP成语

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)

我需要一种UnitInts 中过滤掉s 的方法:

scala> res0.filter(_.isInstanceOf[Int]).map(_.asInstanceOf[Int])
res1: List[Int] = List(6, 10)
Run Code Online (Sandbox Code Playgroud)

一切似乎都精确表达,直到我必须做的过滤器,地图res0提取我关心的值.我可以使用matchersif-else in foo来确保我返回一个Int但是我仍然需要过滤由map操作产生的不需要的值.

任何经过良好调查的Scala开发人员都能阅读这篇文章,可以更深入地了解这种方法的好坏,特别是当我的馆藏变得越来越大时(例如,这个集合可能是分布式Spark RDD)吗?在功能上有更多惯用的方法吗?

Eug*_*nev 7

在这种情况下,如果您需要删除小于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

  • 这个答案并不是错误的,但它并没有真正有用 - 它提供了一个更好的解决方案,但没有解决为什么OP首先得到'AnyVal`等等.我希望人们放慢速度咬住并展示他们的工作 - 这不是一场比赛. (3认同)