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

scala – 是否有任何方法与map()执行相同的操作但生成不同类型的

发布时间:2020-12-16 10:07:46 所属栏目:安全 来源:网络整理
导读:有时我需要通过映射另一个具有不同类型的集合来创建集合.例如,某些函数需要List [_]作为其参数类型,但我需要通过映射IndexedSeq [_]来生成它: val r = (1 to n).map { ... }someFunction(r.toList) 虽然我可以通过首先调用IndexedSeq [_]的map方法然后再调
有时我需要通过映射另一个具有不同类型的集合来创建集合.例如,某些函数需要List [_]作为其参数类型,但我需要通过映射IndexedSeq [_]来生成它:

val r = (1 to n).map { ... }
someFunction(r.toList)

虽然我可以通过首先调用IndexedSeq [_]的map方法然后再调用toList来实现这一点,但这会产生一个冗余的中间集合.有什么方法可以避免这个冗余的步骤,同时仍然保持代码简洁?

解决方法

看看地图的完整签名:

def map[B,That](f: (A) ? B)(implicit bf: CanBuildFrom[List[A],B,That]): That

关键是隐式CanBuildFrom,它控制如何从输入集合生成结果集合.我们可以使用允许我们构建不同结果集合的显式CanBuildFrom替换隐式CanBuildFrom.

更好的是,我们甚至不必编写这种显式方法!它已经以scala.collection.breakOut的形式出现了.来自ScalaDoc:

Provides a CanBuildFrom instance that builds a specific target collection (To’) irrespective of the original collection (From’).

因此,如果我们传入collection.breakOut,我们就可以准确地指定我们想要的map方法:

val x = IndexedSeq(1,2,3,4,5)
x.map[Int,List[Int]](_ * 2)(collection.breakOut)
> res6: List[Int] = List(2,6,8,10)

(编辑:李大同)

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

    推荐文章
      热点阅读