当前位置: 首页 > 知识库问答 >
问题:

在未来序列中迭代未来序列

庄瀚玥
2023-03-14

我正在开发一个用Scala编写的PlayFramework应用程序。

问题在于,在rest控制器中,我需要一个元素列表(书籍),每个元素都需要一个子元素列表(章节)。

图书仓库:

def findAll(): Future[Seq[Book]] 

章节存储库:

def findByBookId(bookId: UUID): Future[Seq[Chapter]]

我想做一些像

val books = bookRepository.findAll
val result = for {
  bookList <- books
  book <- bookList
  chapters <- chapterRepository.findByBookdId(book.id)
} yield (book, chapters)

我想要一个图书及其章节的元组,这样我可以稍后将它映射到一个json。我做错了什么,因为我得到错误:

[error]  required: scala.collection.GenTraversableOnce[?]

或者什么是更好的方法,如何迭代集合的未来,并为每个元素加载另一个集合的未来?

共有3个答案

罗安宁
2023-03-14

在整个理解过程中,应使用相同的类型。

你不能有书:未来[Seq[书]书列表:书包[书]在同一个理解。

您也可以使用< code>Future.sequence将< code>Seq[Future某物]]转换为< code>Future[Seq某物]]

所以,像这样的东西应该有效

val res: Future[(Seq[Book], Seq[Chapter])] =
for {
  bookList <- books
  chapters <- Future.sequence(bookList.map(book => findByBookId(book.id)))
} yield (bookList, chapters.flatten)
程祺
2023-03-14

您只能在 a 中使用一种类型的 monad 进行理解,因为它只是 flatMap 和 map 的语法糖。

请参阅此处的完整描述:https://stackoverflow.com/a/33402543/2750966

宇文良骏
2023-03-14

看看这是否能让你接近你所追求的。

// found books (future)
val fBooks :Future[Seq[Book]] = bookRepository.findAll()

// chapters in fBooks order (future)
val fChptrs :Future[Seq[Seq[Chapter]]] = fBooks.flatMap {books =>
  Future.sequence(books.map(book =>findByBookId(book.id)))
}

// combine book with its chapters
val result :Future[Seq[(Book, Seq[Chapter])]] = for {
  books <- fBooks
  chptrs <- fChptrs
} yield books zip chptrs
 类似资料:
  • 问题内容: 我正在尝试转换为。当您有许多异步任务并且需要获得所有异步任务的结果时,这非常有用。 如果它们中的任何一个失败,那么最终的未来将失败。这就是我实现的方式: 要运行它: 如果其中任何一个失败,则失败。即使有一百万个期货,它也能提供预期的输出。我的问题是:假设如果有超过5000个期货,并且其中任何一个失败,我都会得到: java.util.concurrent.CompletableFutu

  • 我希望像下面这样的代码可以等待这两种未来,但是没有。 我以为< code>seq.onComplete会在完成自身之前等待它们全部完成,但事实并非如此;它会导致: 在scala.concurrent.Future的源代码中有点难以遵循,我想知道如何实现等待(动态大小的)序列的所有原始未来的并行,或者这里可能有什么问题。 编辑:相关问题:https://worldbuilding.stackexch

  • 我正在寻找一种将任意长度的期货列表转换为期货列表的方法。我使用的是Playframework,所以最终,我真正想要的是一个<code>未来〔结果〕,但为了让事情更简单,让我们说<code>将来〔List[Int]]通常的方法是使用<code>Future.sequence(…) 例如,执行以下操作不起作用: 我希望能够将1和3从那里拉出来,而不是只得到异常。我尝试将来使用<code>。折叠,但这显

  • left join 和 inner join的区别 线程池的调用顺序 Spring循环依赖和三级缓存 AOP机制 索引 最左前缀原则的失效 ABCD 有>号 范围查询后会失效 MVCC的实现 可不可以实习

  • 请查看下面位于扩展类内部的代码: null

  • 问题内容: 我尽力而为,但没有找到任何文章和博客可以清楚地比较和,并且提供了很好的分析。 因此,如果任何人都可以向我解释或指向这样的博客或文章,那对我来说真的非常好。 问题答案: 无论 ListenableFuture 和 CompletableFuture 有超过它的父类的优势 未来 通过允许呼叫者在这样或那样的回调“注册”当异步动作已经完成被调用。 使用 Future, 您可以执行以下操作: