例子

//构建一个迭代器
scala> val s=Iterator(1,2,3)
s: Iterator[Int] = non-empty iterator
//输出迭代器的内容
scala>  while(s.hasNext) println(s.next())
1
2
3
//构建一个迭代器
scala> val s=Iterator(1,2,3)
s: Iterator[Int] = non-empty iterator
//输出迭代器内容
scala> s.foreach(println)
1
2
3
//同一迭代器内容不能反复输出,因为指针到最后了
scala> s.foreach(println)scala> val s=Iterator(1,2,3)
s: Iterator[Int] = non-empty iterator
//迭代器的map方法返回的还是一个迭代器
scala> s.map(_*2)
res8: Iterator[Int] = non-empty iterator
//查看迭代器中的元素
scala> s.map(_*2).foreach(println)
2
4
6scala> val s=Iterator(1,2,3)
s: Iterator[Int] = non-empty iterator
//迭代器可以转List
scala> s.toList
res11: List[Int] = List(1, 2, 3)
//迭代器可以转Array
scala> s.toArray
res12: Array[Int] = Array()scala> val s=Iterator(1,2,3)
s: Iterator[Int] = non-empty iterator
//迭代器可以转Array
scala> s.toArray
res13: Array[Int] = Array(1, 2, 3)scala> val s=Iterator(1,2,3)
s: Iterator[Int] = non-empty iteratorscala> s.toSeq
res14: Seq[Int] = Stream(1, ?)scala> val s=Iterator(1,2,3)
s: Iterator[Int] = non-empty iterator
//迭代器可以转Set
scala> s.toSet
res15: scala.collection.immutable.Set[Int] = Set(1, 2, 3)scala> val s=Iterator((1,"a"),(2,"b"),(3,"c"))
s: Iterator[(Int, String)] = non-empty iterator
迭代器可以转Map,但是限与元组类型
scala> s.toMap
res16: scala.collection.immutable.Map[Int,String] = Map(1 -> a, 2 -> b, 3 -> c)scala> val s=Iterator(1,2,3)
s: Iterator[Int] = non-empty iterator
//可以执行过滤操作,完了后还是迭代器类型
scala> s.filter(x=>x==2)
res17: Iterator[Int] = non-empty iteratorscala> s.filter(x=>x==2).foreach(println)scala> val s=Iterator(1,2,3)
s: Iterator[Int] = non-empty iteratorscala> s.filter(x=>x==2).foreach(println)
2scala> val s=Array(1,2,3)
s: Array[Int] = Array(1, 2, 3)
//Array类型可以转Iterator类型
scala> s.toIterator
res0: Iterator[Int] = non-empty iteratorscala> res0.foreach(println)
1
2
3scala> val s=List(1,2,3)
s: List[Int] = List(1, 2, 3)
//List类型可以转Iterator类型
scala> s.toIterator
res2: Iterator[Int] = non-empty iteratorscala> res2.foreach(println)
1
2
3

定义

是个特质,并且继承了TraversableOnce

scala.collection
trait Iterator[+A]
extends TraversableOnce[A]

源码

随便拉一个方法看下源码,以map为例

/** Creates a new iterator that maps all produced values of this iterator*  to new values using a transformation function.**  @param f  the transformation function*  @return a new iterator which transforms every value produced by this*          iterator by applying the function `f` to it.*  @note   Reuse: $consumesAndProducesIterator*/def map[B](f: A => B): Iterator[B] = new AbstractIterator[B] {def hasNext = self.hasNextdef next() = f(self.next())}

与Traversable类型的区别

scala.collection
trait Traversable[+A]
extends TraversableLike[A, Traversable[A]]
with GenTraversable[A] with TraversableOnce[A] with GenericTraversableTemplate[A, Traversa

例子

scala> val s=Traversable(1,2,3)
s: Traversable[Int] = List(1, 2, 3)
//可以反复遍历
scala> s.foreach(println)
1
2
3
//可以反复遍历
scala> s.foreach(println)
1
2
3
//没有nwxt方法
scala> s.next()
<console>:26: error: value next is not a member of Traversable[Int]s.next()^scala> s.next
<console>:26: error: value next is not a member of Traversable[Int]s.next^
//没有hasNext方法
scala> s.hasNext
<console>:26: error: value hasNext is not a member of Traversable[Int]s.hasNext^
//可以转换为List
scala> s.toList
res10: List[Int] = List(1, 2, 3)
//可以转换为Array
scala> s.toArray
res11: Array[Int] = Array(1, 2, 3)
//可以转换为Set
scala> s.toSet
res12: scala.collection.immutable.Set[Int] = Set(1, 2, 3)
//可以使用map方法 .返回的还是Traversable类型
scala> s.map(_*2)
res13: Traversable[Int] = List(2, 4, 6)

迭代器的应用

不要把迭代器想的过于神秘,迭代器也是一个容器,想象成一个类似List的容器,里面也可以有元素,元素的类型可以是各种,可以是简单的,比如String,也可以是元组等等.

当然,迭代器里面的元素也可以应用各种算子,比如map,filter等等,并且其返回值还是一个迭代器类型

object Tmp extends App{//构建一个迭代器对象val s=Iterator(1,2,5,3)test(s)//构建一个迭代器对象val s1=Iterator(("a",1),("b",2),("c",3))test2(s1)
def test(x:Iterator[Int]): Unit ={//把迭代器想象成一个List就可以了,是个容器,里面的元素可以被遍历处理val iterator: Iterator[(Int, Int)] = x.map((_, 1))println(iterator.toList)//List((1,1), (2,1), (5,1), (3,1))
}def test2(x:Iterator[(String,Int)]): Unit ={//迭代器里面的元素当然也可以是元组等复杂类型val iterator: Iterator[((String, Int), Int)] = x.map((_, 1))println(iterator.toList)//List(((a,1),1), ((b,2),1), ((c,3),1))}
}

总结

  • scala的Iterator远比java灵活的多
  • scala的迭代器类型可以转Array,List,Set,Map等等,反之亦然.
  • scala的Iterator type应用filter,map等方法后返回的类型依然是Iterator type.
  • Traversable类型也是用来迭代的,与Iterator的区别在于可以反复遍历
  • scala的Iterator也是个容器,不要想的太复杂,类比List即可
  • Iterator当然也可以作为一种参数类型

scala Iterator类型入门初探相关推荐

  1. Scala入门到精通—— 第二节Scala基本类型及操作、程序控制结构

    本节主要内容 Scala基本类型 基本类型操作 Scala程序控制结构 Scala基本类型 Scala中的基本数据类型如下图: (来源:Programming in scala) 从上表中可以看出,S ...

  2. Scala语法从入门到高级运用

    目录 1.scala语言特点 2.函数式编程 3.scala的安装 4.scala语言的简介 5.scala编程语言的规范 6.scala的类型体系(重点!) 7.变量的用法: 8.数值类型 9.类型 ...

  3. 【Scala 教程】Scala 集合类型

    作者:梦家 个人站点:dreamhomes.top 公众号:DreamHub Scala Collection Scala提供了一套很好的集合实现,提供了一些集合类型的抽象. Scala 集合分为可变 ...

  4. SAP MM 103 + 105 移动类型组合初探

    SAP MM 103 + 105 移动类型组合初探 加入SY项目不久就发现,其某种类型的物料的采购收货,不是传统的方式101移动类型,而是使用103 + 105 组合来实现的.业务背景是采购的物料需要 ...

  5. Scala Iterator(迭代器)详解

    Scala Iterator(迭代器) Scala Iterator(迭代器)不是一个集合,它是一种用于访问集合的方法. 迭代器 it 的两个基本操作是 next 和 hasNext. 调用 it.n ...

  6. Mocha 和 Chai 入门初探

    转载自楼主个人博客 Mocha 和 Chai 入门初探 Chai 在和 jest 作比较的时候, 两者主要的不同就是 jest 的集成度比较高内置断言库, 而 mocha 需要搭配额外的断言库, 在此 ...

  7. Scala之类型参数化:Type Parameterization

    Scala之类型参数化:Type Parameterization 本文原文出处: http://blog.csdn.net/bluishglc/article/details/52584401 严禁 ...

  8. C7510 “iterator”: 类型 从属名称的使用必须以“typename”为前缀

    [解决方法] C7510    "iterator": 类型 从属名称的使用必须以"typename"为前缀 0x00 问题描述 template<typ ...

  9. 深度学习入门初探——损失函数均方误差

    前文已经介绍了损失函数的目的是做什么了的: 深度学习入门初探--引出损失函数https://www.toutiao.com/i7033404064663126560/?group_id=7033404 ...

最新文章

  1. pythonis啥意思-Python中is和==的区别
  2. token干什么用_浅谈Token理解运用
  3. 南大cssci期刊目录_重磅!最新版CSSCI来源期刊目录(20192020)及增减变化!【南大核心】...
  4. Shell脚本中函数位置参数的用法笔记
  5. Java之Base64实现文件和字符串之间的转换
  6. 45万例患者基因检测显示:NGS很难检测出七分之一的致病变异
  7. 新公司入职56天后的面谈小结
  8. Car2go 的前端框架选择
  9. 【算法导论】第15章动态规划
  10. linux串口导致死机,Linux系统死机情况分析与处理方案介绍
  11. 模拟退火算法(SA)
  12. GO ——奇妙的数组
  13. win7下vs2017安装奋斗纠结过程
  14. 几百万数据量的 Excel 导出会内存溢出和卡顿?那是你没用对方法!
  15. Oracle 高效学习的方法论
  16. 【转载】【PC】解决访问小米路由器外接硬盘需要密码/无密码访问小米路由器共享盘
  17. 梅花雨日历控件英文版
  18. DCA决策曲线的解读和代码实现
  19. 鸽哒im即时通讯源码加教程
  20. 【webGoat】Broken Access Control

热门文章

  1. go gorm 关联模式_Beego 结合 GORM 操作 Mysql 数据库
  2. Js判断本地是否存在要存数据
  3. 协程学习-python
  4. xpath抓取html不完全,scrapy的xpath是否取HTML标签的情况分析
  5. 的mvc_你写的MVC,真的是MVC吗?
  6. 为什么mysql查询结果有前缀_字符串的公共前缀对Mysql B+树查询影响回溯分析
  7. python开发好吗_用Python开发应用好用吗?
  8. verilog 简单module_HDLBits:在线学习 Verilog (二十九 · Problem 140-144)
  9. c语言编程发展史详细介绍,一张图让你了解编程语言发展史
  10. rman一致性备份oracle数据库可以在非归档模式下么,探索ORACLE之RMAN_03一致性备份...