多次调用 yield
Multiple calls in for yield
我不明白如何在 for comprehension
中的每个元素上调用我的函数 doSomething()
并由于这里的 .map
而使用 futures 进行管理。
我不确定这样做的好方法是什么。是不是 for comprehension
和 doSomething()
一起使用?
def myFunc(tion(ids: List[Ids]): Future[MyBean] = {
for {
first <- ids.map{ id =>
myDAO.doSomething(id)
}
second <- myDAO.doSomehtingElse(ids)
} yield {
MyBean(first, second)
}
}
def doSomething(id: Id): Future[Long] = Future {...}
def doSomethingElse(ids: List[Id]): Future[Long] = Future {...}
这一行之后:
ids.map{ id =>
myDAO.doSomething(id)
}
您将获得期货清单List[Future[A]]
。为了能够将其与另一个 future 进行 flatMap,您需要将其转换为 Future[List[A]]
。为此,您可以使用 Future.sequence
。此外,您可以使用 Future.traverse
:
Future.traverse(ids)(myDao.doSomething)
在这种情况下,您可以避免使用map
。
最后可以按如下方式进行:
for {
first <- Future.sequence(ids.map(id => myDAO.doSomething(id)))
second <- myDAO.doSomehtingElse(ids)
} yield {
MyBean(first, second)
}
或者:
for {
first <- Future.traverse(ids)(myDAO.doSomething)
second <- myDAO.doSomehtingElse(ids)
} yield {
MyBean(first, second)
}
此外,请记住 myDAO.doSomehtingElse
将按顺序调用 - 而不是并行调用。
我不明白如何在 for comprehension
中的每个元素上调用我的函数 doSomething()
并由于这里的 .map
而使用 futures 进行管理。
我不确定这样做的好方法是什么。是不是 for comprehension
和 doSomething()
一起使用?
def myFunc(tion(ids: List[Ids]): Future[MyBean] = {
for {
first <- ids.map{ id =>
myDAO.doSomething(id)
}
second <- myDAO.doSomehtingElse(ids)
} yield {
MyBean(first, second)
}
}
def doSomething(id: Id): Future[Long] = Future {...}
def doSomethingElse(ids: List[Id]): Future[Long] = Future {...}
这一行之后:
ids.map{ id =>
myDAO.doSomething(id)
}
您将获得期货清单List[Future[A]]
。为了能够将其与另一个 future 进行 flatMap,您需要将其转换为 Future[List[A]]
。为此,您可以使用 Future.sequence
。此外,您可以使用 Future.traverse
:
Future.traverse(ids)(myDao.doSomething)
在这种情况下,您可以避免使用map
。
最后可以按如下方式进行:
for {
first <- Future.sequence(ids.map(id => myDAO.doSomething(id)))
second <- myDAO.doSomehtingElse(ids)
} yield {
MyBean(first, second)
}
或者:
for {
first <- Future.traverse(ids)(myDAO.doSomething)
second <- myDAO.doSomehtingElse(ids)
} yield {
MyBean(first, second)
}
此外,请记住 myDAO.doSomehtingElse
将按顺序调用 - 而不是并行调用。