scala - 集合中 AnyVals 的最佳 FP 习语

标签 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)

我需要一种从 Int 中过滤掉 Unit 的方法,如下所示:

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

在我必须对 res0 执行 filter-map 以提取我关心的值之前,一切似乎都表达得很简洁。我可以在 foo 中使用 matchersif-else 来始终确保返回 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))

你原来的 foo 有类型 Int => AnyVal,因为 scalac 将它转换成类似的东西

def foo(x: Int) = if (x > 2) x*2 else () // () === Unit

Int 和 Unit 的通用父类(super class)型是 AnyVal

关于scala - 集合中 AnyVals 的最佳 FP 习语,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26692541/

相关文章:

java - 如何使用策略或功能接口(interface)处理基于值(枚举)的多种选择?

ios - Swift 中的 FlatMap 和 Init

Python 等同于 LINQ

apache-spark - 如何在Spark中使用HBase表

dataframe - 如何根据一个月中的一周将日期截断为周五?

scala - max() 应该为空列表返回什么?

scala - Scala 中的 "flatmap that s***"惯用表达从何而来?

scala - Scala 有哪些基于 actor 的 Web 框架?

scala - Spark Streaming窗口操作

python - 如何在anaconda中导入pyspark