如何从Either序列中仅提取Right值,将List(1,2,())转为List(1,2)?
从Either序列中提取Right值的解决方案
嘿,我来帮你搞定这个问题!你现在需要从包含Either类型的序列里只保留Right包裹的值,剔除掉Left的部分,对吧?
最简洁优雅的实现:使用collect方法
Scala的collect方法可以同时完成过滤和映射的操作,非常适合这种场景。它接收一个偏函数,只会处理匹配到的元素:
// 假设你的原始Either序列是这样的 val eitherSequence: List[Either[Unit, Int]] = List(Right(1), Right(2), Left(())) // 提取所有Right值 val rightOnlyValues = eitherSequence.collect { case Right(value) => value } // 输出结果:List(1, 2)
这个方法的好处是:
- 一步到位,不需要先过滤再映射
- 类型安全,偏函数只会处理Right类型的元素,避免了手动调用
get可能带来的风险
另一种实现:filter + map
如果你更习惯分步操作,也可以先过滤出isRight为true的元素,再提取Right里的值:
val rightOnlyValues = eitherSequence .filter(_.isRight) // 只保留Right类型的元素 .map(_.right.get) // 提取Right包裹的值
这里因为已经通过filter确保了所有元素都是Right,所以调用right.get是安全的,不会抛出异常。
为什么原来的输出会包含()?
你之前的输出里出现(),是因为序列里存在Left(())这样的元素,而你的代码没有过滤掉Left类型,导致把Left包裹的()也纳入了结果集。通过上面的两种方法,就能精准筛选出Right里的数值啦!
内容的提问来源于stack exchange,提问作者ps0604
相关产品推荐
相关产品推荐

