gpt4 book ai didi

java - Scala Seq.grouped 吃掉我的迭代器

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:52:15 26 4
gpt4 key购买 nike

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

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

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

这给了我最后一条记录,每次都重复。

如果我不使用grouped,它工作正常并且我得到每条记录。我是否遗漏了有关惰性流或 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 以使迭代器正确运行。还有一件事,从症状来看,感觉就像在调用 grouped 之前你已经使用了迭代器。所以要格外小心,检查你之前是否使用过相同的迭代器引用。

关于java - Scala Seq.grouped 吃掉我的迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13047454/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com