breakOut 的转换——使用迭代器还是视图?

Conversion of breakOut - use iterator or view?

Scala 2.13 migration guide 包含有关如何移植 collection.breakOut:

的注释

collection.breakOut no longer exists, use .view and .to(Collection) instead.

下面的几段概述 table 有:

Description Old Code New Code Automatic Migration Rule
collection.breakOut
no longer exists
val xs: List[Int]
= ys.map(f)
(collection.breakOut)
val xs =
ys.iterator.map(f).to(List)
Collection213Upgrade

scala-collection-migration 重写规则使用 .iterator。两者有什么区别?有理由偏爱其中之一吗?

像那样使用时没有真正的区别。

View可以重复使用,而Iterator必须使用一次后丢弃。

val list = List(1,2,3,4,5)

val view = list.view
val viewPlus1 = view.map(_ + 1).toList
view.foreach(println) // works as expected

val it = list.iterator
val itPlus1 = it.map(_ + 1).toList
it.foreach(println) // undefined behavior

在最简单的形式中,View[A] 是函数 () => Iterator[A] 的包装器,因此它的所有方法都可以创建一个新的 Iterator[A] 并委托给该迭代器上的适当方法。