You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 12:18:04