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都可以,然后在进行判断.