这就是答案描述了如何使用scala.collection.breakOut来防止创建浪费的中间集合。例如,这里我们创建了一个中间Seq[(String,String)]
val m = List("A", "B", "C").map(x => x -> x).toMap通过使用breakOut,我们可以防止这个中间Seq的创建。
val m: Map[String,String] = List("A", "B", "C").map(x => x -> x)(breakOut)视图解决了同样的问题。和其他访问元素懒惰地:
val m = (List("A", "B", "C").view map (x => x -> x)).toMap我假设创建View包装相当便宜,所以我的问题是:是否有任何真正的理由使用breakOut而不是View?
发布于 2018-08-29 22:16:58
从Scala2.13开始,这已经不再是一个问题了。突破已被删除,视图是建议的替代。
视图也是collection.breakOut的推荐替代。例如,
val s: Seq[Int] = ...
val set: Set[String] = s.map(_.toString)(collection.breakOut)可以用与以下相同的性能特征来表示:
val s: Seq[Int] = ...
val set = s.view.map(_.toString).to(Set)发布于 2014-01-22 15:12:04
你要从英国到法国旅行。
视图:您正在笔记本中记录一组笔记,一旦调用.force(),就会开始做所有的笔记:buy a ticket, board on the plane, ....
与breakOut:你要离开和繁荣,你在巴黎看到埃菲尔铁塔。你不记得你是如何到达那里的,但你做了这次旅行,只是没有留下任何记忆。
不好的比喻,但我希望这能让你尝一尝它们之间的区别。
发布于 2014-01-22 14:55:46
我不认为views和breakOut是一样的。
breakOut是一种通过消除中间步骤来简化转换操作的CanBuildFrom实现。从A到B不需要中介托收。breakOut意味着让Scala选择适当的构建器对象,以便在给定的场景中最大限度地提高生成新项目的效率。更多细节这里。
views处理一种不同类型的效率,主要销售内容是:“不再有新的对象”。视图存储对对象的轻量引用,以处理不同的使用场景:延迟访问等等。
底线:
如果在map上使用view,那么在生成预期结果之前,仍然可能会得到一个中间引用集合。您仍然可以从以下几个方面获得更好的性能:
collection.view.map(somefn)(breakOut)比来自:
collection.view.map(someFn)https://stackoverflow.com/questions/21285620
复制相似问题