scala Iterator类型入门初探
例子
//构建一个迭代器
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类型入门初探相关推荐
- Scala入门到精通—— 第二节Scala基本类型及操作、程序控制结构
本节主要内容 Scala基本类型 基本类型操作 Scala程序控制结构 Scala基本类型 Scala中的基本数据类型如下图: (来源:Programming in scala) 从上表中可以看出,S ...
- Scala语法从入门到高级运用
目录 1.scala语言特点 2.函数式编程 3.scala的安装 4.scala语言的简介 5.scala编程语言的规范 6.scala的类型体系(重点!) 7.变量的用法: 8.数值类型 9.类型 ...
- 【Scala 教程】Scala 集合类型
作者:梦家 个人站点:dreamhomes.top 公众号:DreamHub Scala Collection Scala提供了一套很好的集合实现,提供了一些集合类型的抽象. Scala 集合分为可变 ...
- SAP MM 103 + 105 移动类型组合初探
SAP MM 103 + 105 移动类型组合初探 加入SY项目不久就发现,其某种类型的物料的采购收货,不是传统的方式101移动类型,而是使用103 + 105 组合来实现的.业务背景是采购的物料需要 ...
- Scala Iterator(迭代器)详解
Scala Iterator(迭代器) Scala Iterator(迭代器)不是一个集合,它是一种用于访问集合的方法. 迭代器 it 的两个基本操作是 next 和 hasNext. 调用 it.n ...
- Mocha 和 Chai 入门初探
转载自楼主个人博客 Mocha 和 Chai 入门初探 Chai 在和 jest 作比较的时候, 两者主要的不同就是 jest 的集成度比较高内置断言库, 而 mocha 需要搭配额外的断言库, 在此 ...
- Scala之类型参数化:Type Parameterization
Scala之类型参数化:Type Parameterization 本文原文出处: http://blog.csdn.net/bluishglc/article/details/52584401 严禁 ...
- C7510 “iterator”: 类型 从属名称的使用必须以“typename”为前缀
[解决方法] C7510 "iterator": 类型 从属名称的使用必须以"typename"为前缀 0x00 问题描述 template<typ ...
- 深度学习入门初探——损失函数均方误差
前文已经介绍了损失函数的目的是做什么了的: 深度学习入门初探--引出损失函数https://www.toutiao.com/i7033404064663126560/?group_id=7033404 ...
最新文章
- pythonis啥意思-Python中is和==的区别
- token干什么用_浅谈Token理解运用
- 南大cssci期刊目录_重磅!最新版CSSCI来源期刊目录(20192020)及增减变化!【南大核心】...
- Shell脚本中函数位置参数的用法笔记
- Java之Base64实现文件和字符串之间的转换
- 45万例患者基因检测显示:NGS很难检测出七分之一的致病变异
- 新公司入职56天后的面谈小结
- Car2go 的前端框架选择
- 【算法导论】第15章动态规划
- linux串口导致死机,Linux系统死机情况分析与处理方案介绍
- 模拟退火算法(SA)
- GO ——奇妙的数组
- win7下vs2017安装奋斗纠结过程
- 几百万数据量的 Excel 导出会内存溢出和卡顿?那是你没用对方法!
- Oracle 高效学习的方法论
- 【转载】【PC】解决访问小米路由器外接硬盘需要密码/无密码访问小米路由器共享盘
- 梅花雨日历控件英文版
- DCA决策曲线的解读和代码实现
- 鸽哒im即时通讯源码加教程
- 【webGoat】Broken Access Control
热门文章
- go gorm 关联模式_Beego 结合 GORM 操作 Mysql 数据库
- Js判断本地是否存在要存数据
- 协程学习-python
- xpath抓取html不完全,scrapy的xpath是否取HTML标签的情况分析
- 的mvc_你写的MVC,真的是MVC吗?
- 为什么mysql查询结果有前缀_字符串的公共前缀对Mysql B+树查询影响回溯分析
- python开发好吗_用Python开发应用好用吗?
- verilog 简单module_HDLBits:在线学习 Verilog (二十九 · Problem 140-144)
- c语言编程发展史详细介绍,一张图让你了解编程语言发展史
- rman一致性备份oracle数据库可以在非归档模式下么,探索ORACLE之RMAN_03一致性备份...