scala - 如何在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
解决方案
这是使用递归函数的替代解决方案,它避免了可变值:
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
如果这实际上不是尾递归,则注释告诉编译器发出警告)
推荐阅读
- arrays - 尝试使用辅助函数填充 char *array,但它会打印象形文字
- javascript - 如何使用 useState 更新数据?
- google-colaboratory - 我无法访问 google colabs 中的任何 github 存储库
- dart - Dart 的双重类型的奇怪行为
- docker - 在 Gitlab CI 上更改 Xdebug 模式 PHP Docker
- javascript - 字体真棒图标js文件问题
- python - 为什么在某些情况下覆盖时 math.infinity 会变成一个大的负整数?
- pywinauto - 从stcwindow读取文本
- mysql - 无法导入mysql表
- flutter - 文本字段高度在颤动中没有减少 | 扑