【发布时间】:2016-03-01 11:56:03
【问题描述】:
我有一个Iterator[Record],它是通过这种方式在record.id 上订购的:
record.id=1
record.id=1
...
record.id=1
record.id=2
record.id=2
..
record.id=2
特定 ID 的记录可能会出现很多次,所以我想编写一个函数,将此迭代器作为输入,并以惰性方式返回 Iterator[Iterator[Record]] 输出。
我能够提出以下建议,但在 500K 左右的记录后,它在 StackOverflowError 上失败了:
def groupByIter[T, B](iterO: Iterator[T])(func: T => B): Iterator[Iterator[T]] = new Iterator[Iterator[T]] {
var iter = iterO
def hasNext = iter.hasNext
def next() = {
val first = iter.next()
val firstValue = func(first)
val (i1, i2) = iter.span(el => func(el) == firstValue)
iter = i2
Iterator(first) ++ i1
}
}
我做错了什么?
【问题讨论】:
-
分组假设您遍历整个集合并对所有值进行分组。我认为懒惰是不可能的
标签: scala stream iterator lazy-evaluation