首页 > 解决方案 > 如何在scala中收集分页结果

问题描述

我试图通过尝试在 Scala 中执行以下逻辑来收集分页结果,但可悲地失败了:

def python_version():
    cursor 
    books, cursor = fetch_results()
    while (cursor!=null) {
        new_books = fetch_results(cursor)
        books = books + new_books
    }
    return books


def fetch_results(cursor=None):
    #do some fetchings...
    return books, next_cursor

标签: scalapagination

解决方案


这是使用递归函数的替代解决方案,它避免了可变值:

def fetchResults(c: Option[Cursor]=None): (List[Book], Option[Cursor]) = ...

def fetchAllResults(): List[Book] = {
  @tailrec
  def loop(cursor: Option[Cursor], res: List[Book]): List[Book] = {
    val (books, newCursor) = fetchResults(cursor)
    val newBooks = res ::: books

    newCursor match {
      case Some(_) =>
        loop(newCursor, newBooks)
      case None =>
        newBooks
    }
  }

  loop(None, Nil)
}

这是 Scala 中递归函数的一个相当标准的模式,其中实际递归是在内部函数中完成的。上一次迭代的结果被传递给下一次迭代,然后从函数中返回。这意味着这loop是一个尾递归函数,可以由编译器优化成一个while循环。(@tailrec如果这实际上不是尾递归,则注释告诉编译器发出警告)


推荐阅读