Scala向seq添加元素并处理未来、映射和异步行为
我还是scala的新手,还不太了解Futures/Maps/Flatmaps/Seq的概念以及如何正确使用它们 这就是我想要做的(伪代码): 我想添加一个Scala向seq添加元素并处理未来、映射和异步行为,scala,playframework,playframework-2.0,Scala,Playframework,Playframework 2.0,我还是scala的新手,还不太了解Futures/Maps/Flatmaps/Seq的概念以及如何正确使用它们 这就是我想要做的(伪代码): 我想添加一个Future[Option[Foo]]到contentComponent.pictures:Option[Seq[Foo]]如下: case 2 => contentComponent.pictures :+ contentComponentDTO.getContentComponentPicture(contentComponent.i
Future[Option[Foo]]
到contentComponent.pictures:Option[Seq[Foo]]
如下:
case 2 => contentComponent.pictures :+ contentComponentDTO.getContentComponentPicture(contentComponent.id.get) //contentComponent.pictures is Option[Seq[Foo]]
最后通过json将整个contentComponent返回到前端
我知道最终这可能与实际代码相去甚远,但我希望您能理解。谢谢 我将忽略您的代码,只关注简短且有意义的内容: 我想向contentComponent添加一个未来的[Option[Foo]]。图片:Option[Seq[Foo]]如下: 让我们这样做,重点关注代码可读性:
// what you already have
val someFuture: Future[Option[Foo]] = ???
val pics: Option[Seq[Foo]] = contentComponent.pictures
// what I'm adding
val result: Future[Option[Seq[Foo]]] = someFuture.map {
case None => pics
case Some(newElement) =>
pics match {
case None => Some(Seq(newElement)) // not sure what you want here if pics is empty...
case Some(picsSequence) => Some(picsSequence :+ newElement)
}
}
要显示flatMap
的示例,假设您需要另一个未来的result
结果,只需执行以下操作:
val otherFuture: Future[Any] = ???
val everything: Future[Option[Seq[Foo]]] = otherFuture.flatmap { otherResult =>
// do something with otherResult i.e., the code above could be pasted in here...
result
}
我的回答将试图帮助你解决一些概念性的子问题,这些子问题构成了你整体大问题的一部分
flatMap
和产量的
flatMap
的要点之一是帮助解决问题。当你有
嵌套在结构中的结构嵌套在结构中的结构中
doA().map { resultOfA =>
doB(resultOfA).map { resolutOfB =>
doC(resultOfB).map { resultOfC =>
...
}
}
}
如果您使用来获得收益
,您将获得现成的flatMap
,它允许您
压平金字塔
因此,您的代码看起来更像一个线性结构
for {
resultOfA <- doA
resultOfB <- doB(resultOfA)
resultOfC <- doC(resultOfB)
...
} yield {...}
用于{
结果一个问题太宽泛/不明确请也完成你的部分工作,拿出一个更简单的例子。这是一个非常简单的问题,但你的例子增加了很多不相关的复杂性。哦,好吧,我想你可能需要背景。威尔edit@cchantep这有帮助吗?你对我有什么期望?我真的不能再多说了。
for {
resultOfA <- doA
resultOfB <- doB(resultOfA)
resultOfC <- doC(resultOfB)
...
} yield {...}