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 正在将列表[Future[Int]]转换为期货失败的未来[List[Int]]_Scala_Scala Collections - Fatal编程技术网

Scala 正在将列表[Future[Int]]转换为期货失败的未来[List[Int]]

Scala 正在将列表[Future[Int]]转换为期货失败的未来[List[Int]],scala,scala-collections,Scala,Scala Collections,假设我有以下代码片段 def testFailure2() = { val f1 = Future.failed(new Exception("ex1")) val f2 = Future.successful(2); val f3 = Future.successful((5)); val f4 = Future.failed(new Exception("ex4")) val l = List(f1, f2, f3, f4) l } 返回

假设我有以下代码片段

def testFailure2() = {
    val f1 = Future.failed(new Exception("ex1"))
    val f2 = Future.successful(2);
    val f3 = Future.successful((5));
    val f4 = Future.failed(new Exception("ex4"))
    val l = List(f1, f2, f3, f4)
    l
  }
返回类型为List[Future[Int]]。在正常情况下,我可以只执行Future.sequence并获取List[Future[Int]]。但在这种情况下,它不会起作用,因为我有一个失败的未来。因此,我想通过忽略失败的期货,将其转换为List[Future[Int]]。我该怎么做

关于类似主题的第二个问题是,我了解列表中的过滤、收集、分区等。在这个场景中,假设我想将列表过滤/划分为两个列表 -一次失败的期货 -在另一家公司成功地完成了期货交易


如何做到这一点?

一种方法是首先将所有未来[Int]转换为始终成功的未来[Option[Int]],但如果原始未来失败,则不会产生任何结果。然后可以使用Future.sequence,然后展平结果:

def sequenceIgnoringFailures[A](xs: List[Future[A]])(implicit ec: ExecutionContext): Future[List[A]] = {
  val opts = xs.map(_.map(Some(_)).fallbackTo(Future(None)))
  Future.sequence(opts).map(_.flatten)
}

一种方法是首先将所有Future[Int]转换为Future[Option[Int]],该选项始终成功,但如果原始Future失败,则不会产生任何结果。然后可以使用Future.sequence,然后展平结果:

def sequenceIgnoringFailures[A](xs: List[Future[A]])(implicit ec: ExecutionContext): Future[List[A]] = {
  val opts = xs.map(_.map(Some(_)).fallbackTo(Future(None)))
  Future.sequence(opts).map(_.flatten)
}

另一个答案是正确的:您应该使用未来的[List[X]],其中X是区分失败和成功的东西。它可以是一种选择,一种选择,一种尝试,或者任何你想要的

你似乎被这件事困扰了,我想这是因为你愿意找到这样的东西:

所有这些未来都是并行的,在这个过程中忽略失败的未来 你被给予

做所有这些未来,等待一切结束,并根据结果放弃 但实际上,没有特别的方式来表达忽略失败的。既然你对未来的结果感兴趣,就必须承认它,否则一开始就毫无意义。这件事必须等待所有的未来完成。因此,你现在可以忽略我的标志实际上是没有选择,要么留下,要么尝试失败。毫无疑问,没有一个特定的标志来表示这个结果将被丢弃,我认为scala也不需要一个


所以,不要害怕,走向未来[List[X]],因为它实际上表达了你想要的东西-

另一个答案是正确的:你应该使用未来的[List[X]],其中X是区分失败和成功的东西。它可以是一种选择,一种选择,一种尝试,或者任何你想要的

你似乎被这件事困扰了,我想这是因为你愿意找到这样的东西:

所有这些未来都是并行的,在这个过程中忽略失败的未来 你被给予

做所有这些未来,等待一切结束,并根据结果放弃 但实际上,没有特别的方式来表达忽略失败的。既然你对未来的结果感兴趣,就必须承认它,否则一开始就毫无意义。这件事必须等待所有的未来完成。因此,你现在可以忽略我的标志实际上是没有选择,要么留下,要么尝试失败。毫无疑问,没有一个特定的标志来表示这个结果将被丢弃,我认为scala也不需要一个


所以,不要害怕,走向未来[List[X]],因为它实际上表达了你想要的东西-

在Future.sequence上,不管结果是成功还是失败,你都必须进行模式匹配,在这里你可以对失败的期货做任何你想做的事情。那么Future.sequence可以接受我只收集成功期货的PF吗?因为如果我进行模式匹配,我可能会得到Future[Option[Int]],它更像FutureSome1,None,etc@prayagupd,Future.sequence,takes iterable,我将如何对其进行案例匹配?在Future.sequence上,您必须对结果进行模式匹配,无论是成功还是失败,在这里,你可以对失败的期货做任何你想做的事情。那么,Future.sequence可以接受一个我只收集成功期货的PF吗?因为如果我进行模式匹配,我可能会得到Future[Option[Int]],它更像FutureSome1,None,etc@prayagupd,Future.sequence,takes iterable,如何对其进行大小写匹配?这是一个很好的片段。谢谢。但我能不能用成功的期货来做一个PF呢?我想不出该怎么做,如果可能的话,List的collect方法必须立即执行,而你直到将来某个时候才知道futures是否成功。这是一个很好的片段。谢谢。但我能不能用成功的期货来做一个PF呢?我想不出该怎么做,如果可能的话,List的collect方法必须立即执行,而你直到将来某个时候才知道期货是否成功。我得到了答案。你的回答也让我确信,是的,除了你的建议之外,没有别的办法。我找到了另一个类似的答案。我正努力把它包起来
左/右。一旦我映射了这个列表,我就会得到一个Future[Int]。但我无法对其进行案例匹配以填写左/右。我尝试的语法无法编译。我该怎么做?终于又找到了val=l.map{fut=>fut.mapx=>Rightx.recover{case f=>Leftf}}看起来很完美:我得到了答案。你的回答也让我确信,是的,除了你的建议之外,没有别的办法。我找到了另一个类似的答案。我正努力把它用左/右包装起来。一旦我映射了这个列表,我就会得到一个Future[Int]。但我无法对其进行案例匹配以填写左/右。我尝试的语法无法编译。我该怎么做?终于又找到了val=l.map{fut=>fut.mapx=>Rightx.recover{case f=>Leftf}}看起来很完美: