【scala】迭代器
如何访问集合呢?我们首先想到的是使用for循环来访问,还有一种方法是通过迭代器来访问。
在Scala中,迭代器(Iterator)不是一个集合,但是,提供了访问集合的一种方法。
迭代器包含两个基本的操作:1.next(),可以返回迭代器的下一个元素 2.hasnext(),检测是否还有下一个元素
示例
val iter = Iterator("Hadoop","Spark","Java");//定义一个迭代器
while(iter.hasnext()){
println(iter.next())
}
当然我们还可以通过for来遍历迭代器
for(elem <- iter){
println(elem)
}
迭代器还有不同的种类,当我们使用容器的grouped和siding方法的时候将返回两种功能不同的迭代器。
这两种迭代器返回的不是单个元素,而是原来容器元素的全部子序列。
grouped方法返回的是元素的增量分块。
val xs= Lisr(1,2,3,4,5);
val git =xs grouped 3;
//注意这种写法等同于:val git = xs.grouped(3);
//再例如,a + b 等同于 a.+(b)
//因为scala中所有都是对象
println(git.next()); ---> List(1,2,3)
println(git.next()); ---->List(4,5)
//我们注意到,grouped(3)是以3个元素为单位分组归并为一个迭代器单元,最后不够不补齐
sliding方法生成一个滑动元素的窗口。
val xs= Lisr(1,2,3,4,5);
val git =xs sliding 3;//等同于:val git = xs.sliding(3);
println(git.next()); ---> List(1,2,3)
println(git.next()); ---->List(2,3,4)
println(git.next()); ---->List(3,4,5)
//我们注意到,sliding(3)是以原容器3个元素为单位分组归并为一个迭代器单元
//然后推进一个元素,再以3个元素为单位归并为一个迭代器单元,直到结束
迭代器还有一些其他常用的方法
获取迭代器的长度 iter.size iter.length
我们同样还能用迭代器来找出最大最小元素
val ita = Iterator(20,40,2,50,69, 90);
val itb = Iterator(20,40,2,50,69, 90);
println("迭代长度是:" + ita.length );
println("迭代长度是:" + itb.size);
println("最大元素是:" + ita.max ); --> 90
println("最小元素是:" + ita.min ); --> 2
细心的同学可以发现,min和max是从两个迭代器中求出的,我们难道不能使用同一个迭代器吗?
是不可以的,因为每个迭代器只能迭代一次
就是说,一个迭代器从头到尾求出了最大值,就完了,并不能再从头来过找最小值,只能另建立一个相同迭代器来找最小值。
下面给出迭代器的所有方法
1 |
def hasNext: Boolean 如果还有可返回的元素,返回true。 |
2 |
def next(): A 返回迭代器的下一个元素,并且更新迭代器的状态 |
3 |
def ++(that: => Iterator[A]): Iterator[A] 合并两个迭代器 |
4 |
def ++[B >: A](that :=> GenTraversableOnce[B]): Iterator[B] 合并两个迭代器 |
5 |
def addString(b: StringBuilder): StringBuilder 添加一个字符串到 StringBuilder b |
6 |
def addString(b: StringBuilder, sep: String): StringBuilder 添加一个字符串到 StringBuilder b,并指定分隔符 |
7 |
def buffered: BufferedIterator[A] 迭代器都转换成 BufferedIterator |
8 |
def contains(elem: Any): Boolean 检测迭代器中是否包含指定元素 |
9 |
def copyToArray(xs: Array[A], start: Int, len: Int): Unit 将迭代器中选定的值传给数组 |
10 |
def count(p: (A) => Boolean): Int 返回迭代器元素中满足条件p的元素总数。 |
11 |
def drop(n: Int): Iterator[A] 返回丢弃前n个元素新集合 |
12 |
def dropWhile(p: (A) => Boolean): Iterator[A] 从左向右丢弃元素,直到条件p不成立 |
13 |
def duplicate: (Iterator[A], Iterator[A]) 生成两个能分别返回迭代器所有元素的迭代器。 |
14 |
def exists(p: (A) => Boolean): Boolean 返回一个布尔值,指明迭代器元素中是否存在满足p的元素。 |
15 |
def filter(p: (A) => Boolean): Iterator[A] 返回一个新迭代器 ,指向迭代器元素中所有满足条件p的元素。 |
16 |
def filterNot(p: (A) => Boolean): Iterator[A] 返回一个迭代器,指向迭代器元素中不满足条件p的元素。 |
17 |
def find(p: (A) => Boolean): Option[A] 返回第一个满足p的元素或None。注意:如果找到满足条件的元素,迭代器会被置于该元素之后;如果没有找到,会被置于终点。 |
18 |
def flatMap[B](f: (A) => GenTraversableOnce[B]): Iterator[B] 针对迭代器的序列中的每个元素应用函数f,并返回指向结果序列的迭代器。 |
19 |
def forall(p: (A) => Boolean): Boolean 返回一个布尔值,指明 it 所指元素是否都满足p。 |
20 |
def foreach(f: (A) => Unit): Unit 在迭代器返回的每个元素上执行指定的程序 f |
21 |
def hasDefiniteSize: Boolean 如果迭代器的元素个数有限则返回true(缺省等同于isEmpty) |
22 |
def indexOf(elem: B): Int 返回迭代器的元素中index等于x的第一个元素。注意:迭代器会越过这个元素。 |
23 |
def indexWhere(p: (A) => Boolean): Int 返回迭代器的元素中下标满足条件p的元素。注意:迭代器会越过这个元素。 |
24 |
def isEmpty: Boolean 检查it是否为空, 为空返回 true,否则返回false(与hasNext相反)。 |
25 |
def isTraversableAgain: Boolean Tests whether this Iterator can be repeatedly traversed. |
26 |
def length: Int 返回迭代器元素的数量。 |
27 |
def map[B](f: (A) => B): Iterator[B] 将 it 中的每个元素传入函数 f 后的结果生成新的迭代器。 |
28 |
def max: A 返回迭代器迭代器元素中最大的元素。 |
29 |
def min: A 返回迭代器迭代器元素中最小的元素。 |
30 |
def mkString: String 将迭代器所有元素转换成字符串。 |
31 |
def mkString(sep: String): String 将迭代器所有元素转换成字符串,并指定分隔符。 |
32 |
def nonEmpty: Boolean 检查容器中是否包含元素(相当于 hasNext)。 |
33 |
def padTo(len: Int, elem: A): Iterator[A] 首先返回迭代器所有元素,追加拷贝 elem 直到长度达到 len。 |
34 |
def patch(from: Int, patchElems: Iterator[B], replaced: Int): Iterator[B] 返回一个新迭代器,其中自第 from 个元素开始的 replaced 个元素被迭代器所指元素替换。 |
35 |
def product: A 返回迭代器所指数值型元素的积。 |
36 |
def sameElements(that: Iterator[_]): Boolean 判断迭代器和指定的迭代器参数是否依次返回相同元素 |
37 |
def seq: Iterator[A] 返回集合的系列视图 |
38 |
def size: Int 返回迭代器的元素数量 |
39 |
def slice(from: Int, until: Int): Iterator[A] 返回一个新的迭代器,指向迭代器所指向的序列中从开始于第 from 个元素、结束于第 until 个元素的片段。 |
40 |
def sum: A 返回迭代器所指数值型元素的和 |
41 |
def take(n: Int): Iterator[A] 返回前 n 个元素的新迭代器。 |
42 |
def toArray: Array[A] 将迭代器指向的所有元素归入数组并返回。 |
43 |
def toBuffer: Buffer[B] 将迭代器指向的所有元素拷贝至缓冲区 Buffer。 |
44 |
def toIterable: Iterable[A] Returns an Iterable containing all elements of this traversable or iterator. This will not terminate for infinite iterators. |
45 |
def toIterator: Iterator[A] 把迭代器的所有元素归入一个Iterator容器并返回。 |
46 |
def toList: List[A] 把迭代器的所有元素归入列表并返回 |
47 |
def toMap[T, U]: Map[T, U] 将迭代器的所有键值对归入一个Map并返回。 |
48 |
def toSeq: Seq[A] 将代器的所有元素归入一个Seq容器并返回。 |
49 |
def toString(): String 将迭代器转换为字符串 |
50 |
def zip[B](that: Iterator[B]): Iterator[(A, B) 返回一个新迭代器,指向分别由迭代器和指定的迭代器 that 元素一一对应而成的二元组序列 |
【scala】迭代器的更多相关文章
- Scala入门教程---《chang哥教你一天搞定Scala》
<chang哥教你一天搞定Scala> /** * <chang哥教你一天搞定Scala> * scala是一门多范式编程语言,集成了面向对象编程和函数式编程等多种特性. * ...
- Spark记录-Scala集合
Scala列表 Scala列表与数组非常相似,列表的所有元素都具有相同的类型,但有两个重要的区别. 首先,列表是不可变的,列表的元素不能通过赋值来更改. 其次,列表表示一个链表,而数组是平的. 具有类 ...
- Scala:集合类型Collection和迭代器
http://blog.csdn.net/pipisorry/article/details/52902549 Scala Collection Scala 集合分为可变的和不可变的集合. 可变集合可 ...
- 大数据学习day15----第三阶段----scala03--------1.函数(“_”的使用, 函数和方法的区别)2. 数组和集合常用的方法(迭代器,并行集合) 3. 深度理解函数 4 练习(用java实现类似Scala函数式编程的功能(不能使用Lambda表达式))
1. 函数 函数就是一个非常灵活的运算逻辑,可以灵活的将函数传入方法中,前提是方法中接收的是类型一致的函数类型 函数式编程的好处:想要做什么就调用相应的方法(fliter.map.groupBy.so ...
- scala 数据结构(十):折叠、扫描、拉链(合并)、迭代器
1 折叠 fold函数将上一步返回的值作为函数的第一个参数继续传递参与运算,直到list中的所有元素被遍历. 1)可以把reduceLeft看做简化版的foldLeft. 如何理解: def redu ...
- Scala中apply的用法
Scala中的 apply 方法有着不同的含义, 对于函数来说该方法意味着调用function本身, 以下说明摘自Programming in Scala, 3rd Edition Every fun ...
- scala Basic 第三课
yield 在学习c#的时候学习过这个关键字,和这时的语义是一致的. 当你生成一个新的迭代器,而并不是想立刻使用,而是在其他地方使用的时候,可以延迟生成这个集合, 这时候yield关键字可以帮你完成这 ...
- [Scala] 快学Scala A2L2
集合 13.1 集合的三大类 所有的集合都扩展Iterable特质.集合的三大集合为Seq, Set, Map Seq是一个有先后次序的值的序列,比如数组或列表.IndexSeq允许我们通过整型下表快 ...
- [Scala] 快学Scala A1L1
基础 1.1 声明值和变量 在Scala中,鼓励使用val; 不需要给出值或变量的类型,这个信息可以从初始化表达式推断出来.在必要的时候,可以指定类型. 在Scala中,仅当同一行代码中存在多条语句时 ...
随机推荐
- 如何使用django中的cookie和session?
1.Cookie 介绍 Cookie是由服务器端生成,发送给User-Agent(一般是浏览器),浏览器会将Cookie的key/value保存到某个目录下的文本文件内,下次请求同一网站时就发送该Co ...
- Spring 数据库连接池读取系统环境变量作为参数
原来是写在一个properties文件里面,后来项目要部署的的确太多了,每次更改不太方便,就想把这些固定不变的信息写在当地的环境变量里面 原先是这样的:引用的所有信息在jdbc.properties ...
- python2函数
1.函数的定义 函数的定义形式如下: def <name>(arg1,arg2...argN): <statements> 函数的名字必须以字母开头,可以包括下划线.函数的目的 ...
- python1变量,表达式和语句
1.变量和类型 变量是指向各种类型值的名字,以后再用到某个值时,直接引用这个名字即可,不用再写具体的值,在python中,变量的使用环境非常宽松,没有明显的变量声明,而且类型不是固定的.如果你不能确定 ...
- 5 TensorFlow入门笔记之RNN实现手写数字识别
------------------------------------ 写在开头:此文参照莫烦python教程(墙裂推荐!!!) ---------------------------------- ...
- 一个简单的仿 Launcher 应用
本例实现两个功能: 系统桌面上的app图标能够排列在我们的页面上. 点击自定义桌面上的app图标,能够打开对应的app. 实现思路: 我们知道,一个应用的启动页 Activity 的 Intent 的 ...
- Codeforces - 55D Beautiful numbers (数位dp+数论)
题意:求[L,R](1<=L<=R<=9e18)区间中所有能被自己数位上的非零数整除的数的个数 分析:丛数据量可以分析出是用数位dp求解,区间个数可以转化为sum(R)-sum(L- ...
- 整合subeclipse和Tortoise SVN
先来一个下载链接(subeclipse1.8和TortoiseSVN1.7): http://download.csdn.net/detail/cangfengluyu/8416395 对于同 ...
- Linux 进程管理 进程优先级管理
Linux进程优先级 Linux 是一个多用户.多任务的操作系统,系统中通常运行着非常多的进程.但是 CPU 在一个时钟周期内只能运算一条指令(现在的 CPU 采用了多线程.多核心技术,所以在一个时钟 ...
- 在HI3531上移植和运行QT4.8.6
在HI3531上移植和运行QT4.8.6 1. 前言: 近段有点时间,想把QT移植到HI3531上,在网上查找了很多资料,但都不是很全面,有些有问题也没有得到很好的体现. 2. ...