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]
并委托给该迭代器上的适当方法。
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 existsval 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]
并委托给该迭代器上的适当方法。