【问题标题】:scala: what is the most elegant way to convert a list of Tries to a Try of list? [duplicate]scala:将 Tries 列表转换为 Try 列表的最优雅方法是什么? [复制]
【发布时间】:2023-03-05 14:05:01
【问题描述】:

假设我在 scala 中有一个尝试列表,例如:List(Try(a), Try(b), Try(c))。 如果要编写一个代码 sn-ps,如果所有尝试都成功则返回 Success(List(a, b, c)),如果其中一个尝试失败则返回失败。

我发现这样做的唯一方法是:

private def convertArrayOfSuccessesToSuccessOfByteArray(
      tryArrayForOutput: Array[Try[Byte]]
  ): Success[Array[Byte]] = {
    val outputArray = ArrayBuffer[Byte]()
    tryArrayForOutput.foreach(tryElem => {
      val Success(elem) = tryElem
      outputArray.append(elem)
    })
    Success(outputArray.toArray)
  }

如您所见,它非常繁琐且不那么“实用”。

【问题讨论】:

    标签: scala


    【解决方案1】:

    只需 get 每个值并用 Try 包装以捕获第一个错误(如果有)

    Try(tryArrayForOutput.map(_.get))
    

    【讨论】:

    • 它绝对可以工作,但在很多地方对 Try 对象调用“get”被认为是一种不好的做法。
    【解决方案2】:

    @Tim 的回答在这种情况下很好。

    一种更通用的功能方式是foldflatMap

    private def convertArrayOfSuccessesToSuccessOfByteArray(tryArrayForOutput: Seq[Try[Byte]]): Try[Seq[Byte]] = {
        tryArrayForOutput.foldLeft(Try(Seq[Byte]())) { (acc: Try[Seq[Byte]], t: Try[Byte]) =>
          acc.flatMap { seq: Seq[Byte] =>
            t.map((b: Byte) => seq :+ b)
          }
        }
      }
    

    这可以概括,通常是 Cats 等库提供的一种方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-05
      • 1970-01-01
      • 2010-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-23
      • 2011-05-29
      相关资源
      最近更新 更多