gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 09:56:08 24 4
gpt4 key购买 nike

我有一个这样定义的映射器函数:

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com