根据我目前看到的代码示例,鉴于rowParsertype RowParser[Photo],这就是你如何解析来自 table 的行列表:photo
def getPhotos(album: Album): List[Photo] = DB.withConnection { implicit c =>
  SQL("select * from photo where album = {album}").on(
    'album -> album.id
  ).as(rowParser *)
}
运算符在其中*创建类型为 的解析器ResultSetParser[List[Photo]]。现在,我想知道是否同样有可能获得一个产生 a 的解析器Stream(认为更懒惰总是更好),但我只是想出了这个:
def getPhotos(album: Album): Stream[Photo] = DB.withConnection { implicit c =>
  SQL("select * from photo where album = {album}").on(
    'album -> album.id
  )() collect (rowParser(_) match { case Success(photo) => photo })
}
它有效,但似乎过于复杂。我当然可以调用我从第一个函数中得到的,但我的目标是只应用于toStream实际读取的行。有没有更简单的方法来实现这一点?ListrowParser
编辑:如果事先知道感兴趣的行数,我知道limit应该在查询中使用它。我也知道,在很多情况下,无论如何你都会使用整个结果,所以懒惰不会提高性能。但是在某些情况下,您可能会节省几个周期,例如,如果由于某种原因,您有无法或不想在 SQL 中表达的搜索条件。所以我觉得奇怪的是,鉴于 anorm 提供了一种获得 a Streamof 的方法SqlRow,我没有找到一种直接的方法来应用 a RowParser。