gpt4 book ai didi

scala - 如何将 Seq[Try] 转换为 Try[Seq]

转载 作者:行者123 更新时间:2023-12-02 14:47:36 26 4
gpt4 key购买 nike

使用 Futures 有一种简单的方法可以将 Seq[Future] 转换为 Future[Seq]:

future .sequence(seqOfFutures)

我无法通过 Try 找到模拟的东西。

它适用于 foldLeft 但我真正喜欢的是 Try.sequence(seqOfTry)

为什么没有提供这样的功能?

这是如何正确完成的?

语义:

成功值列表:Success(Seq(1,2,3,4))

失败有两种可能性:

  • 在第一个 Failure 上失败并返回它。这是由这个问题处理的:listtryt-to-trylistt-in-scala

  • 收集所有失败 并返回“复合”失败。

对于'复合'失败还有解决方案吗?

最佳答案

根据 Luis 的建议,Validated 是为错误累积而设计的,因此请考虑 traverse像这样

la.traverse(_.toEither.toValidatedNec)
lb.traverse(_.toEither.toValidatedNec)

哪些输出

res2: cats.data.ValidatedNec[Throwable,List[Int]] = Invalid(Chain(java.lang.RuntimeException: boom, java.lang.RuntimeException: crash))
res3: cats.data.ValidatedNec[Throwable,List[Int]] = Valid(List(1, 2, 3))

在哪里

import cats.syntax.traverse._
import cats.instances.list._
import cats.syntax.either._
import scala.util.{Failure, Success, Try}

val la: List[Try[Int]] = List(Success(1), Success(2), Failure(new RuntimeException("boom")), Success(3), Failure(new RuntimeException("crash")))
val lb: List[Try[Int]] = List(Success(1), Success(2), Success(3))

如果没有错误累积,我们可以像这样排序

import cats.implicits._
la.sequence

哪些输出

res0: scala.util.Try[List[Int]] = Failure(java.lang.RuntimeException: boom)

关于scala - 如何将 Seq[Try] 转换为 Try[Seq],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58074846/

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