为Paginated API创建Scala迭代器

时间:2011-01-28 13:26:34

标签: api scala iterator pagination

我正在编写一个Scala库,以便更轻松地查询分页JSON API。每个API调用都返回一个如下所示的对象:

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

我想要一个返回某种迭代器的函数,比如MyIterator [Record]。在Scala世界中是否有任何标准方法可以做到这一点,甚至可能在标准库中构建可以帮助我的方法?

我通常使用lift-json进行JSON解析,如果这有用的话。

感谢。

1 个答案:

答案 0 :(得分:5)

如果您有Iterator[Iterator[A]],则可以使用flatten生成Iterator[A],将所有嵌套的迭代器链接在一起:

scala> Iterator(Iterator(1, 2), Iterator(3, 4)).flatten.toList
res0: List[Int] = List(1, 2, 3, 4)

结合迭代器companion object上的一种工厂方法,您可以将其转换为单行:

Iterator.range(1, pageCount).map(i: Int => fetchPage(i)).flatten

如果您只能通过检索页面来获取页数,则可能需要更复杂一些......例如:

val (firstPage, pageCount) = getFirstPageWithCount()
firstPage ++ (Iterator.range(2, pageCount).map(fetchPage).flatten)