【问题标题】:Making a Scala Iterator for a Paginated API为分页 API 制作 Scala 迭代器
【发布时间】:2011-06-17 06:08:30
【问题描述】:

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

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

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

如果有帮助的话,我通常使用 lift-json 来解析我的 JSON。

谢谢。

【问题讨论】:

    标签: api scala iterator pagination


    【解决方案1】:

    如果您有一个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)
    

    【讨论】:

    • 谢谢,大卫,这很有帮助。我的目标 API 只给出第一页的页数,所以我必须使用第二种方法。有没有办法只在必要时获取后续页面?也就是说,一种惰性初始化?
    • 其实我给你的例子已经很懒了。 (请尝试Iterator.range(1, 10).map { x => println(x); x } .take(3).toList 自行验证。)
    • 触摸!很酷,谢谢!顺便说一句,Stream 什么时候更合适?
    • stackoverflow.com/questions/1527962/… 很好地讨论了这些差异,我认为。
    猜你喜欢
    • 2021-04-21
    • 2019-01-06
    • 1970-01-01
    • 1970-01-01
    • 2015-09-13
    • 2011-12-09
    • 1970-01-01
    • 2012-03-08
    • 2013-04-27
    相关资源
    最近更新 更多