微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

java – Scala Seq.grouped吃了我的迭代器

作为一名C#程序员,我对Java / Scala迭代器设计有一个粗略的理解.

我试图(懒惰 – 因为源可能很大)从RecordReader(在某些第三方库)中读取记录.我需要每100条记录做一些额外的工作.

for (group <- reader.iterator.zipwithIndex.grouped(100)) {
  for ((record, i) <- group) {
    println(i + "|" + record.key)
  }
  // ...
}

这给了我每次重复的最后记录.

如果我不使用分组,它工作正常,我得到每个记录.我错过了关于延迟流式传输或Java迭代器的一些事情吗?

解决方法:

要进行故障排除,请尝试在另一个打印正在发生的事情的迭代器中装饰迭代器:

def wrap[T](i: Iterator[T]) = new Iterator[T] {
  def hasNext = { val b = i.hasNext; println("hasNext => " + b); b }
  def next() = { val n = i.next(); println("next() => " + n); n }
}

val reader = Iterator.from(20).take(10).toList
for (group <- wrap(reader.iterator).zipwithIndex.grouped(5)) {
  for ((v, i) <- group) println("[" + i + "] = " + v)
}

在第一次实例化迭代器时,在迭代器上调用wrap.这将打印如下:

hasNext => true
hasNext => true
next() => 20
hasNext => true
next() => 21
hasNext => true

这应该可以帮助您确定迭代器是否表现不佳……例如,库可能无法正确处理多次调用hasNext而不调用next.在这种情况下,您可以修改wrap,以便使迭代器的行为正确.还有一件事,从症状来看,感觉你已经在调用分组之前使用了迭代器.所以要格外小心并检查之前是否使用过相同的迭代器引用.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐