Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala向seq添加元素并处理未来、映射和异步行为_Scala_Playframework_Playframework 2.0 - Fatal编程技术网

Scala向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

我还是scala的新手,还不太了解Futures/Maps/Flatmaps/Seq的概念以及如何正确使用它们

这就是我想要做的(伪代码):

我想添加一个
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 {...}