加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 收藏中AnyVals的最佳FP习语

发布时间:2020-12-16 09:07:18 所属栏目:安全 来源:网络整理
导读:我有一个映射器函数定义如下: def foo(x:Int) = if (x2) x*2 该方法的类型签名是Int = AnyVal.现在,如果我将此函数映射到整数列表: scala List(-1,3,-4,5).map(foo)res0: List[AnyVal] = List((),6,(),10) 我需要一种从Ints中过滤掉单位的方法,如下所示:
我有一个映射器函数定义如下:

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

该方法的类型签名是Int => AnyVal.现在,如果我将此函数映射到整数列表:

scala> List(-1,3,-4,5).map(foo)
res0: List[AnyVal] = List((),6,(),10)

我需要一种从Ints中过滤掉单位的方法,如下所示:

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,5).collect(foo))

您的原始foo类型为Int => AnyVal,因为scalac将其转换为类似的东西

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

Int和Unit的常见超类型是AnyVal

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读