为分页 API 创建 Scala 迭代器

发布于 2024-10-14 18:32:07 字数 328 浏览 1 评论 0原文

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

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

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

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

谢谢。

I'm writing a Scala library to make querying an paginated JSON API easier. Each API call returns an object that looks something like this:

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

I'd like to have a function that returned some sort of iterator like MyIterator[Record]. Are there any standard ways to do this in the Scala world, perhaps even constructs in the standard library that could help me?

I'm using lift-json generally for my JSON parsing, if that's helpful.

Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

oО清风挽发oО 2024-10-21 18:32:07

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

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

与迭代器上的工厂方法之一结合 伴随对象< /a>,您可能可以将其变成单行:

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

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

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

If you have an Iterator[Iterator[A]] you can use flatten to produce an Iterator[A] which chains all the nested Iterators together:

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

Combined with one of the factory methods on the Iterator companion object, you could probably turn this into a one-liner:

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

It might need to be a bit more complex if you can only get the page count by retrieving a page... something like:

val (firstPage, pageCount) = getFirstPageWithCount()
firstPage ++ (Iterator.range(2, pageCount).map(fetchPage).flatten)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文