作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个这样定义的映射器函数:
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
中使用 matchers 或 if-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/
场景如下: 我将我的应用程序运行所需的几个 .xml(某种配置)文件捆绑在一个 .jar 文件中。 jar 文件具有以下结构: settings-1.0.0.jar ˪ resources/ ˪
我是一名优秀的程序员,十分优秀!