scala Iterator类型入门初探

61 篇文章 0 订阅

例子

//构建一个迭代器
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
6

scala> 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 iterator

scala> 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 iterator

scala> s.filter(x=>x==2).foreach(println)

scala> val s=Iterator(1,2,3)
s: Iterator[Int] = non-empty iterator

scala> s.filter(x=>x==2).foreach(println)
2

scala> val s=Array(1,2,3)
s: Array[Int] = Array(1, 2, 3)
//Array类型可以转Iterator类型
scala> s.toIterator
res0: Iterator[Int] = non-empty iterator

scala> res0.foreach(println)
1
2
3

scala> val s=List(1,2,3)
s: List[Int] = List(1, 2, 3)
//List类型可以转Iterator类型
scala> s.toIterator
res2: Iterator[Int] = non-empty iterator

scala> 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.hasNext
    def 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当然也可以作为一种参数类型
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值