使用iterator的注意点

  iterator是我们编程中经常使用的,我们都知道在取迭代器中的元素时,是通过改变指针的位置来获取到元素,而指针位置如果发生变化,就无法在获取到上一个指针位置的元素, 而iterator的某些方法也同样是遍历所有的元素,即指针的位置会移位到最后.我在使用的时候就遇到了这个问题,也是对迭代器的了解不够多,这里就以我遇到的问题举个例子.
  我是编写spark core数据处理流程,以数据表中的xid最为分组,返回的数据形式为tuple2,第一个位置就是xid,第二个位置就是iterator,iterator中的每一个字符串对应数据表中的一行数据,如果该xid对应的数据行数不足6行我需要进行一种处理,大于6行的进行另一种逻辑处理,这里的时候我就对terator的长度进行了判断,结果就是判断完成,却拿不到数据.

这里以简单的代码为例子

    val it = ArrayBuffer(1, 2, 3, 4, 5, 6, 7, 8, 9).iterator
    if (it.size > 5) {
      println("已经满足判断条件")
      val buffer = it.toBuffer
      println("===== " + buffer + " =======")
    }

通过以上代码可以看到iterator的长度实际为9,满足if的判断条件,但是当我控制台打印it.toBuffer时,结果如下
在这里插入图片描述
可以看到,实际已经进入到了if的执行逻辑里面,但是打印出来的ArrayBuffer是空的.这就是因为当我调用了iterator.size的方法后,iterator的指针已经就移位到了最后,所以当iterator.toBuffer的时候并没有实际的数据,所以我们在使用iterator的时候一定要注意这一点,碰到类似的问题我们可以先iterator的数据转成list或者array都可以,然后在进行判断.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值