Scala:迭代器源码分析

Scala:迭代器源码分析,第1张

Scala:迭代器源码分析

下面代码使用map对所有元素加一,并不会使得list元素改变,也就是新的加一的集合开启了新的空间

val list= List(1,2,3,4,5,6)
list.foreach(println)
list.map(_ + 1)
list.foreach(println)

同理,下面是wordcount的部分代码,会浪费很多内存空间

val wordCount= List("hello world","hello scala","hello spark")
val word = wordCount.flatMap(_.split(" "))
val wordTuple = word.map((_, 1))

这就产生了迭代器模式,来节省来内存

val wordCount= List("hello world","hello scala","hello spark")
val iterator = wordCount.iterator
val word = iterator.flatMap(_.split(" "))
val wordTuple = word.map((_, 1))
wordTuple.foreach(println)

输出:
(hello,1)
(world,1)
(hello,1)
(scala,1)
(hello,1)
(spark,1)

为什么可以减少内存呢?scala迭代器源码分析

上面是形象化代码嵌套的过程

每次.iterator 都会new AbstractIterator,得到第一个迭代器器,之后迭代器每次调用的方法得到的都是迭代器,AbstractIterator有重要的两个方法hasNext和next
同样迭代器没有做真正的计算,只是new AbstractIterator,以及隐式的调用链的构造
在真正调用hasNext 或者 next才会触发调用过程

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5695801.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存