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
我试图通过这个 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