Scala - 迭代器


迭代器不是集合,而是一种逐个访问集合元素的方法。迭代器的两个基本操作是nexthasNext对it.next()的调用将返回迭代器的下一个元素并推进迭代器的状态。您可以使用 Iterator 的it.hasNext方法了解是否有更多元素要返回。

“单步执行”迭代器返回的所有元素的最直接方法是使用 while 循环。让我们按照以下示例程序进行操作。

例子

object Demo {
   def main(args: Array[String]) {
      val it = Iterator("a", "number", "of", "words")
      
      while (it.hasNext){
         println(it.next())
      }
   }
}

将上述程序保存在Demo.scala中。以下命令用于编译和执行该程序。

命令

\>scalac Demo.scala
\>scala Demo

输出

a
number
of
words

查找最小和最大值元素

您可以使用it.minit.max方法从迭代器中找出最小值和最大值元素。这里,我们使用itaitb来执行两个不同的操作,因为迭代器只能遍历一次。以下是示例程序。

例子

object Demo {
   def main(args: Array[String]) {
      val ita = Iterator(20,40,2,50,69, 90)
      val itb = Iterator(20,40,2,50,69, 90)
      
      println("Maximum valued element " + ita.max )
      println("Minimum valued element " + itb.min )
   }
}

将上述程序保存在Demo.scala中。以下命令用于编译和执行该程序。

命令

\>scalac Demo.scala
\>scala Demo

输出

Maximum valued element 90
Minimum valued element 2

求迭代器的长度

您可以使用it.sizeit.length方法来查找迭代器中可用元素的数量。这里,我们使用 ita 和 itb 来执行两个不同的操作,因为迭代器只能遍历一次。以下是示例程序。

例子

object Demo {
   def main(args: Array[String]) {
      val ita = Iterator(20,40,2,50,69, 90)
      val itb = Iterator(20,40,2,50,69, 90)
      
      println("Value of ita.size : " + ita.size )
      println("Value of itb.length : " + itb.length )
   }
}

将上述程序保存在Demo.scala中。以下命令用于编译和执行该程序。

命令

\>scalac Demo.scala
\>scala Demo

输出

Value of ita.size : 6
Value of itb.length : 6

Scala 迭代器方法

以下是您在使用迭代器时可以使用的重要方法。有关可用方法的完整列表,请查看 Scala 官方文档。

先生编号 带有描述的方法
1

def hasNext: 布尔值

测试此迭代器是否可以提供另一个元素。

2

def next(): A

生成此迭代器的下一个元素。

3

def ++(即: => 迭代器[A]): 迭代器[A]

将此迭代器与另一个迭代器连接起来。

4

def ++[B >: A](that :=> GenTraversableOnce[B]): 迭代器[B]

将此迭代器与另一个迭代器连接起来。

5

def addString(b: StringBuilder): StringBuilder

返回附加了元素的字符串生成器 b。

6

def addString(b: StringBuilder, sep: String): StringBuilder

返回使用分隔符字符串附加元素的字符串构建器 b。

7

def 缓冲: BufferedIterator[A]

从此迭代器创建一个缓冲迭代器。

8

def contains(elem: Any): 布尔值

测试此迭代器是否包含给定值作为元素。

9

def copyToArray(xs: Array[A], start: Int, len: Int): 单位

将此迭代器生成的选定值复制到数组中。

10

def count(p: (A) => 布尔值): Int

计算可遍历对象或迭代器中满足谓词的元素数量。

11

def drop(n: Int): 迭代器[A]

使迭代器前进到前 n 个元素或迭代器的长度(以较小者为准)。

12

def dropWhile(p: (A) => 布尔值): 迭代器[A]

跳过此迭代器中满足给定谓词 p 的最长元素序列,并返回剩余元素的迭代器。

13

def 重复: (迭代器[A], 迭代器[A])

创建两个新的迭代器,它们都迭代与此迭代器相同的元素(以相同的顺序)。

14

def 存在(p: (A) => 布尔值): 布尔值

如果给定谓词 p 对于此迭代器生成的某些值成立,则返回 true,否则返回 false。

15

def 过滤器(p: (A) => 布尔值): 迭代器[A]

返回此迭代器中满足谓词 p 的所有元素的迭代器。元素的顺序被保留。

16

def filterNot(p: (A) => 布尔值): 迭代器[A]

在该迭代器中不满足谓词 p 的所有元素上创建一个迭代器。

17 号

def find(p: (A) => 布尔值): 选项[A]

查找迭代器生成的满足谓词的第一个值(如果有)。

18

def flatMap[B](f: (A) => GenTraversableOnce[B]): 迭代器[B]

通过将函数应用于此迭代器生成的所有值并连接结果来创建新的迭代器。

19

def forall(p: (A) => 布尔值): 布尔值

如果给定谓词 p 对于该迭代器生成的所有值都成立,则返回 true,否则返回 false。

20

def foreach(f: (A) => 单位): 单位

将函数 f 应用于此迭代器生成的所有值。

21

def hasDefiniteSize: 布尔值

对于空迭代器返回 true,否则返回 false。

22

def indexOf(元素: B): Int

返回指定对象在此可迭代对象中第一次出现的索引。

23

def indexWhere(p: (A) => 布尔值): Int

返回满足谓词的第一个生成值的索引,或 -1。

24

def isEmpty: 布尔值

如果 hasNext 为 false,则返回 true,否则返回 false。

25

def isTraversableAgain: 布尔值

测试此Iterator是否可以重复遍历。

26

默认长度:Int

返回此迭代器中的元素数量。该方法返回后,迭代器就到达其末尾。

27

def map[B](f: (A) => B): 迭代器[B]

返回一个新的迭代器,该迭代器通过应用函数 f 来转换该迭代器生成的每个值。

28

最大定义值:A

找到最大的元素。该方法返回后,迭代器就到达其末尾。

29

定义最小值:A

找到最小元素。该方法返回后,迭代器就到达其末尾。

30

def mkString: 字符串

以字符串形式显示此可遍历对象或迭代器的所有元素。

31

def mkString(sep: 字符串): 字符串

使用分隔符字符串在字符串中显示此可遍历对象或迭代器的所有元素。

32

def nonEmpty: 布尔值

测试可遍历对象或迭代器是否不为空。

33

def padTo(len: Int, elem: A): 迭代器[A]

将元素值附加到此迭代器,直到达到给定的目标长度。

34

def patch(来自: Int, patchElems: Iterator[B], 替换为: Int): Iterator[B]

返回带有修补值的迭代器。

35

默认产品:A

将此集合的元素相乘。

36

def sameElements(that: Iterator[_]): 布尔值

如果两个迭代器以相同的顺序生成相同的元素,则返回 true,否则返回 false。

37

def seq: 迭代器[A]

返回集合的顺序视图。

38

默认大小:Int

返回此可遍历对象或迭代器中的元素数量。

39

def slice(从: Int, 直到: Int): 迭代器[A]

创建一个迭代器,返回由此迭代器生成的值的区间。

40

定义总和:A

返回此可遍历对象或迭代器相对于 num 中的 + 运算符的所有元素的总和。

41

def take(n: Int): 迭代器[A]

返回一个仅生成该迭代器的前 n 个值的迭代器,如果生成的值少于 n 个值,则返回整个迭代器。

42

def toArray: 数组[A]

返回一个包含此可遍历对象或迭代器的所有元素的数组。

43

def toBuffer: 缓冲区[B]

返回一个包含此可遍历对象或迭代器的所有元素的缓冲区。

44

def toIterable: 可迭代[A]

返回一个 Iterable,其中包含此可遍历对象或迭代器的所有元素。对于无限迭代器,这不会终止。

45

def toIterator: 迭代器[A]

返回一个包含此可遍历对象或迭代器的所有元素的迭代器。对于无限迭代器,这不会终止。

46

def toList: 列表[A]

返回包含此可遍历对象或迭代器的所有元素的列表。

47

def toMap[T, U]: 地图[T, U]

返回一个包含此可遍历对象或迭代器的所有元素的映射。

48

def toSeq: Seq[A]

返回包含此可遍历对象或迭代器的所有元素的序列。

49

def toString(): 字符串

将此迭代器转换为字符串。

50

def zip[B](即: 迭代器[B]): 迭代器[(A, B)

返回一个新的迭代器,其中包含由该迭代器的相应元素组成的对。新迭代器返回的元素数量与迭代器(A 或 B)返回的最小元素数量相同。

scala_collections.htm