Scala:集合转换的副作用

Scala: Side effects with collection transformations

我试图通过这个 link http://docs.scala-lang.org/overviews/collections/views.html.

理解 scala 中的视图

我不明白集合转换 have/not 副作用是什么意思! ?

谢谢

有副作用是指当您在集合转换中执行关闭某些外部状态的代码时,或者有任何副作用会影响除转换结果之外的任何其他内容的情况。示例:

val l = List(1, 2, 3, 4).view.map(x => {println(x); x + 1})

当您执行此代码时,它不会打印任何内容,因为 view 延迟了 map 的执行。此外,每次您尝试遍历此列表时,都会执行 map,导致打印值的次数超出预期。

  var counter = 0
  val ll = for (i <- List(1, 2, 3, 4).view)
            yield { counter += 1; i + 1}
  println(counter)      // 0
  println(ll.toList)    // this executes .force internally
  println(counter)      // 4

行为如出一辙,却更出乎意料。 counter 仅在迭代之后增加,并且鉴于 ll 是惰性和延迟的,迭代可能在代码中发生得更深,导致 counter 在此之前等于 0

Scala 具有不可变的集合(scala.collection.immutable 中的所有内容)。这些集合类型没有修改它们的操作,只能获取修改后的副本。

例如这个

Set(1) + 2

将为您提供一个包含 1 和 2 的新集合,而不是修改第一个集合。这同样适用于 map、flatMap、filter 等转换。

观点并没有改变任何事情。视图和它所基于的集合之间的唯一区别是,对视图的(大多数)操作是惰性的,即不计算中间结果。

val l1 = List(1,2) 
val l2 = List(1,2).map(x => x + 1) // a new List(2,3) is computed here
l2.foreach(println) // the elements of l2 are just printed

观看次数:

val v2 = l1.view.map(x => x + 1) // nothing is computed here
v2.foreach(println) // the values are computed step by step