为分页API创建Scala迭代器

4

我正在编写一个Scala库,以使查询分页JSON API更加容易。 每个API调用都会返回一个类似于以下内容的对象:

{
  "count": 100,
  "current_page": 1,
  "total_pages": 2,
  "records": [
    ...
  ]
}

我希望有一个返回类似于MyIterator[Record]的迭代器函数。在Scala世界中是否有任何标准方法可以做到这一点,甚至是标准库中的构造函数可以帮助我吗?
通常我使用lift-json进行JSON解析,如果这有帮助的话。
谢谢。
1个回答

6
如果您有一个Iterator[Iterator[A]],则可以使用flatten来生成一个Iterator[A],将所有嵌套的迭代器链接在一起:
scala> Iterator(Iterator(1, 2), Iterator(3, 4)).flatten.toList
res0: List[Int] = List(1, 2, 3, 4)

结合 Iterator 的伴生对象中的一个工厂方法 (companion object),你可能可以将其转换为一行代码:
Iterator.range(1, pageCount).map(i: Int => fetchPage(i)).flatten

如果您只能通过检索页面来获取页面计数,则可能需要更复杂的操作,例如:
val (firstPage, pageCount) = getFirstPageWithCount()
firstPage ++ (Iterator.range(2, pageCount).map(fetchPage).flatten)

谢谢,David,这非常有帮助。我所针对的API只在第一页时给出页数,所以我必须使用第二种方法。是否有任何方法只在需要时获取后续页面?也就是说,一种懒惰初始化的方式? - pr1001
实际上,我给你的例子已经是懒加载的了。(尝试使用Iterator.range(1, 10).map { x => println(x); x } .take(3).toList来验证) - David Winslow
太棒了!非常酷,谢谢!顺便问一下,什么时候使用Stream会更合适? - pr1001
https://dev59.com/3nI_5IYBdhLWcg3wF_B3 这篇文章讨论了Scala中迭代器和流的区别,我认为写得非常好。 - David Winslow

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接