Scala递归移除Option列表None时报空列表head异常如何解决
Scala递归过滤Option列表None元素问题解决
问题原因
- 缺少递归终止条件:递归遍历到输入列表为空(
Nil)时,仍然尝试调用input.head获取首元素,空列表不存在head元素,直接触发java.util.NoSuchElementException: head of empty list异常 - 写法存在安全隐患:匹配非None分支后调用
input.head.get的操作冗余,不符合Scala Option的最佳实践
可行实现方案
要求不能使用if语句、不能调用其他现成工具函数,直接基于列表整体模式匹配实现即可:
def RemoveNone2(input: List[Option[Int]]) : List[Int] = input match { // 递归终止条件:空列表直接返回空 case Nil => Nil // 当前元素为None,跳过当前元素继续递归处理剩余列表 case None :: tail => RemoveNone2(tail) // 当前元素为Some,提取包裹的数值拼接至结果,继续递归处理剩余列表 case Some(value) :: tail => value :: RemoveNone2(tail) } // 测试代码 val optional: List[Option[Int]] = List(Some(13), None, Some(32), None, Some(51), None, Some(17), None) // 运行输出:List(13, 32, 51, 17) RemoveNone2(optional)
该实现完全满足要求:所有分支逻辑通过模式匹配实现,未使用if语句;未调用任何额外工具函数,仅依赖原生递归和Scala列表/Option的模式匹配能力;同时避免了显式调用head、tail、get等可能触发空访问异常的方法,安全性更高。
内容的提问来源于stack exchange,提问作者user16298506
相关产品推荐
相关产品推荐

