gpt4 book ai didi

scala - Scala 中 List[Try[String]] 的分区

转载 作者:行者123 更新时间:2023-12-02 04:56:06 25 4
gpt4 key购买 nike

我有一个 TryList,我需要按 FailureSuccess 进行分区,如下:

import scala.util.{Try, Success, Failure}

val list = List(Success(10), Success(20), Failure(new Exception("error1")), Success(30))

val (listTryFailures: List[Try[Int]], listTrySuccesses: List[Try[Int]]) = list.partition(_.isFailure)
listTryFailures: List[Try[Int]] = List(Failure(java.lang.Exception: error1))
listTrySuccesses: List[Try[Int]] = List(Success(10), Success(20), Success(30))

val (listFailures: List[Throwable], listSuccesses: List[Int]) = (listTryFailures.map(_.failed.get), listTrySuccesses.map(_.get))
listFailures: List[Throwable] = List(java.lang.Exception: error1)
listSuccesses: List[Int] = List(10, 20, 30)

是否已经有一个函数可以实现这一点?(而不是调用丑陋的 partition(_.isFailure) + map(_.failed.get) + map(_.get)) ?

ps:另一种选择如下:

val listFailures: List[Throwable] = list.collect { case Failure(f) => f }
val listSuccesses: List[String] = list.collect { case Success(entry) => entry }

// or
val listFailures: List[Throwable] = list.flatMap(_.failed.toOption)
val listSuccesses: List[String] = list.flatMap(_.toOption)

但我问标准库中是否已存在 partitionSuccess (或类似名称)函数:

val (listFailures: List[Throwable], listSuccesses: List[Int]) = list.partitionSuccess

最佳答案

从 Scala 2.13 开始,大多数集合现在都提供 partitionMap方法,根据返回 RightLeft 的函数对元素进行分区。

在我们的例子中,我们可以使用一个函数来调用 partitionMap ,该函数将 Try 转换为 Either 以便分区Successes 为 RightFailureLeft:

// val list = List(Success(10), Success(20), Failure(new Exception("error1")))
val (failures, successes) = list.partitionMap(_.toEither)
// failures: List[Throwable] = List(java.lang.Exception: error1)
// successes: List[Int] = List(10, 20)

关于scala - Scala 中 List[Try[String]] 的分区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40042779/

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