0
我在文件中有一组名称。我需要实现一个不断循环遍历的Generator。但是,代码在第一次传递后无限期挂在if (iter.hasNext)
处。圆形发电机无限期悬挂
代码
var asStream = getClass.getResourceAsStream("/firstnames/female/en_US_sample.txt")
var source: BufferedSource = Source.fromInputStream(asStream)
var iter: Iterator[String] = Iterator.continually(source.getLines()).flatten
val genLastName: Gen[String] = {
genCannedData
}
def genCannedData: Gen[String] = {
println("Generating names: " + iter)
Gen.delay {
if (iter.hasNext) {
println("In if")
Gen.const(iter.next)
}
else {
println("In else")
Gen.const(iter.next)
}
}
}
样品性能试验
property("FirstNames") = {
forAll(genLastName) {
a => {
println(a)
a == a
}
}
}
en_US_sample.txt文件内容
Abbie
Abby
Abigail
Ada
Adah
编辑 - 临时工作代码
下面的代码工作,如果我重新迭代器,但我不知道为什么Iterator.continually
是挂?
def genCannedData: Gen[String] = {
Gen.delay {
if (iter.hasNext) {
Gen.const(iter.next)
}
else {
asStream = getClass.getResourceAsStream("/firstnames/female/en_US_sample.txt")
source = Source.fromInputStream(asStream)
iter = source.getLines()
Gen.const(iter.next)
}
}
}
有没有更好的方式来写它,而不是像我在工作代码中显示的那样重新初始化流? –
创建一个全部元素的列表(通过'source.getLines()。toList')然后'Iterator.continually(theList).flatten'。这种方式只能用于内存时才能使用。否则,重新初始化流是一种方式。 – kawty