gpt4 book ai didi

scala - 使用一个服务调用(List)的结果来获取另一个 List

转载 作者:行者123 更新时间:2023-12-04 14:54:20 24 4
gpt4 key购买 nike

我有一个服务返回一个数据类型(下面的 Foo),其中包含要用于第二个服务调用的 id 列表 getBar以下

case class Foo(barIds: List[Int])
case class Bar(id: Int)

val f = Future(List(Foo(List(1, 2)), Foo(List(5, 6))))
def getBar(l: List[Int]) = Future(l.map(Bar(_)))

我需要的是 Future[List[Foo,List[Bar]]]
我首先尝试了一个嵌套的 for-comprehension 但

val rr = for {
foos <- f
} yield for {
foo <- foos
bars <- getBar(foo.barIds) // won't work as this is a Future and foos is a list
} yield (foo,bars)

然后我玩了一个 map 游戏,(闻起来很可怕):
f.map(
foos => foos.map(foo => (foo, foo.barIds)))
.map(ts => ts.map(t => (t._1, getBar(t._2)))
)

但这给了我一个 Future[List[Foo,Future[List[Bar]]]]
应该有办法得到 Future[List[Foo,List[Bar]]]并希望以更清洁的方式

这是一个 scalfiddle https://scalafiddle.io/sf/P0FRIGs/0

请注意,我所追求的值是:带有 Foo 的元组和“他们”关联的 Bar 值的列表:
List(
(Foo(List(1, 2)),List(Bar(1), Bar(2))),
(Foo(List(5, 6)),List(Bar(5), Bar(6)))
)

最佳答案

我不确定您希望列表的结构如何,但是这样的操作可以吗?

import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.Future
import scala.util.Success

case class Foo(barIds: List[Int])
case class Bar(id: Int)

val f: Future[List[Foo]] = Future(List(Foo(List(1, 2)), Foo(List(5, 6))))
def getBar(l: List[Int]): Future[List[Bar]] = Future(l.map(Bar(_)))

val bars: Future[List[Bar]] = f.flatMap(x => getBar(x.flatMap(_.barIds)))

val out: Future[List[(Foo, List[Bar])]] = for {
foo <- f
bar <- bars
} yield {
foo.map(x => (x, bar))
}

out andThen {case Success(v)=>println(v) }

// List((Foo(List(1, 2)),List(Bar(1), Bar(2), Bar(5), Bar(6))), (Foo(List(5, 6)),List(Bar(1), Bar(2), Bar(5), Bar(6))))

[Fiddle]

关于scala - 使用一个服务调用(List)的结果来获取另一个 List,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50834490/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com