首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >scala.collection.breakOut与视图

scala.collection.breakOut与视图
EN

Stack Overflow用户
提问于 2014-01-22 14:27:19
回答 4查看 4.2K关注 0票数 15

这就是答案描述了如何使用scala.collection.breakOut来防止创建浪费的中间集合。例如,这里我们创建了一个中间Seq[(String,String)]

代码语言:javascript
复制
val m = List("A", "B", "C").map(x => x -> x).toMap

通过使用breakOut,我们可以防止这个中间Seq的创建。

代码语言:javascript
复制
val m: Map[String,String] = List("A", "B", "C").map(x => x -> x)(breakOut)

视图解决了同样的问题。和其他访问元素懒惰地:

代码语言:javascript
复制
val m = (List("A", "B", "C").view map (x => x -> x)).toMap

我假设创建View包装相当便宜,所以我的问题是:是否有任何真正的理由使用breakOut而不是View

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2018-08-29 22:16:58

从Scala2.13开始,这已经不再是一个问题了。突破已被删除,视图是建议的替代。

Scala2.13集合返工

视图也是collection.breakOut的推荐替代。例如,

代码语言:javascript
复制
val s: Seq[Int] = ... 
val set: Set[String] = s.map(_.toString)(collection.breakOut)

可以用与以下相同的性能特征来表示:

代码语言:javascript
复制
val s: Seq[Int] = ... 
val set = s.view.map(_.toString).to(Set)
票数 3
EN

Stack Overflow用户

发布于 2014-01-22 15:12:04

你要从英国到法国旅行。

视图:您正在笔记本中记录一组笔记,一旦调用.force(),就会开始做所有的笔记:buy a ticket, board on the plane, ....

与breakOut:你要离开和繁荣,你在巴黎看到埃菲尔铁塔。你不记得你是如何到达那里的,但你做了这次旅行,只是没有留下任何记忆。

不好的比喻,但我希望这能让你尝一尝它们之间的区别。

票数 13
EN

Stack Overflow用户

发布于 2014-01-22 14:55:46

我不认为viewsbreakOut是一样的。

breakOut是一种通过消除中间步骤来简化转换操作的CanBuildFrom实现。从A到B不需要中介托收。breakOut意味着让Scala选择适当的构建器对象,以便在给定的场景中最大限度地提高生成新项目的效率。更多细节这里

views处理一种不同类型的效率,主要销售内容是:“不再有新的对象”。视图存储对对象的轻量引用,以处理不同的使用场景:延迟访问等等。

底线:

如果在map上使用view,那么在生成预期结果之前,仍然可能会得到一个中间引用集合。您仍然可以从以下几个方面获得更好的性能:

代码语言:javascript
复制
collection.view.map(somefn)(breakOut)

比来自:

代码语言:javascript
复制
collection.view.map(someFn)
票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21285620

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档