Scala 3 如何类型安全拆分List[Try[String]]为Success和Failure子类型列表
Scala 3 类型安全拆分
List[Try[String]] 方案 可以通过以下几种完全类型安全的方式实现需求,无需手动强转:
- 方案一:使用
partitionMap一次性拆分得到两个子类型列表(推荐)partitionMap是Scala 2.13+及Scala 3内置的集合API,可直接返回两个不同类型的列表,搭配模式匹配自动缩窄Try的子类型:
import scala.util.{Try, Success, Failure} val tries = List(Success("1"), Failure(Exception("2"))) val (failures, successes) = tries.partitionMap { case s: Success[String] => Right(s) case f: Failure[Throwable] => Left(f) } // 编译自动推导得到: // successes: List[Success[String]] // failures: List[Failure[Throwable]]
如果只需要成功的取值和失败的异常,不需要保留Success/Failure容器,可简化为:
val (exceptions, successValues) = tries.partitionMap(_.toEither) // 编译自动推导得到: // successValues: List[String] // exceptions: List[Throwable]
- 方案二:单独提取成功/失败列表
如果只需要其中一侧的列表,直接用collect结合模式匹配即可:
// 仅提取成功项 val successes: List[Success[String]] = tries.collect { case s: Success[String] => s } // 仅提取失败项 val failures: List[Failure[Throwable]] = tries.collect { case f: Failure[Throwable] => f }
原写法返回
List[Try[String]]是因为partition、filter的API设计仅返回和原集合元素类型相同的结果,编译器不会根据运行时的isSuccess、isInstanceOf判断自动缩窄类型,而模式匹配配合partitionMap/collect会在编译期完成类型校验和缩窄,完全避免不安全的强制类型转换。
内容的提问来源于stack exchange,提问作者mitchus
相关产品推荐
相关产品推荐

