Scala函数式程序设计 week2 Lazy Evaluation
2017-09-20 19:25
295 查看
迭代器
可以用iterator方法从集合获得一个迭代器。
对于那些完整构造需要很大开销的集合而言,迭代器很有用。
有了迭代器,可以用
next和
hasNext来遍历集合中的元素
while(iter.hasNext) 对 iter.next()执行某种操作 //--------------------- for (elem <- iter) 对elem执行某种操作
上述两种循环都会将迭代器移动到集合的末尾,在此之后就不能再使用了。
Iterator类定义了与集合方法使用起来完全相同的方法。除了head,headOption,last,lastOption,tail,init,takeRight,dropRight外。
在调用了诸如map,filter,count,sum甚至length方法后,迭代器将位于集合的尾端。
对于其他方法,比如find或take,迭代器位于已找到元素或已取得元素之后。
可以用toArray,toIterable,toSeq,toSet或toMap将值拷贝到新的集合中。
流
迭代器具有一个缺点,每次对next的调用都会改变迭代器的指向。stream提供的是一个不可变的替代品。流是一个尾部被懒计算的不可变列表,只有当需要时才会被计算。
def numsFrom(n:Int):Stream[Int] = n #:: numsFrom(n+1)
#::操作符类似
::操作符,种子不过构建出来的是一个流。
调用
调用 val tenOrMore = numsFrom(10)时 得到的是一个被显示为 Stream(10,?) 的流对象
其尾部是未被求值的。
流的方法是懒执行的
val squares = numsFrom(1).map(x => x*x)//将产出 Stream(1,?)
如果想要得到多个答案,可以调用
take,然后用
force,这将强制对所有值求值。
如
squares.take(5).forece squares.force //不能这样写,这个调用尝试对一个无穷流的所有成员进行求值,引发内存错误
可以从迭代器构造一个流。流将缓存访问过的所有行,允许重新访问。
相关文章推荐
- Scala函数式程序设计 week3 Functions and State
- Scala函数式程序设计 week4 Timely Effects
- Scala函数式程序设计 week1 For Expressions and Monads
- Scala函数式程序设计原理 week2 Higher Order Functions
- Scala学习(三)函数式对象
- F#程序设计-函数式编程之模式匹配
- Spark程序设计——Scala
- 【连载】Scala程序设计:Java虚拟机多核编程实战——简介
- Scala学习笔记(三)scala的函数式编程
- Scala——函数式
- Scala:函数式编程之下划线underscore
- Scala 函数式编程进阶 2 更详 代码说明
- F# 微软的函数式程序设计语言
- 【译】Object Dumper: 函数式程序设计编码中的强大工具
- Scala学习笔记(3):纯函数式编程的一些思想和技巧
- 【连载】Scala程序设计:Java虚拟机多核编程实战——简介
- Scala学习笔记03【学习识别Scala函数式风格】
- Play scala 6 函数式的异常处理
- 面向对象的函数式编程语言Scala - 简介安装
- C#函数式程序设计之用闭包封装数据的实现代码