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

Scala无var实现字符串列表过滤函数报类型不匹配错误求解

错误原因解析
  • 直接报错是因为recFilter方法的条件判断分支不全:Scala 中if是有返回值的表达式,你只写了filter(workList.head)为true时的执行逻辑,没有写判断不成立时的分支。当条件不满足时,这个if表达式没有返回对应类型的值,默认返回Unit,和方法声明的返回类型List[String]冲突,因此抛出类型不匹配错误。
  • 还有一个隐藏问题:你采用头插法(workList.head :: filteredList)累积符合条件的元素,最终得到的列表是原列表符合条件元素的逆序,运行后会输出people Hello,和预期的Hello people不符。
修正后的完整代码
object Main {
  def main(args: Array[String]): Unit = {
    println(filterList(List("Hello", "there", "people"), _.contains('l')).mkString(" "))
  }

  def filterList(listToSort:List[String], filter: String => Boolean): List[String] = {
    @scala.annotation.tailrec
    def recFilter(workList: List[String], filteredList: List[String]): List[String] = {
      if(workList.isEmpty)
        filteredList.reverse // 反转头插导致的逆序,恢复原列表顺序
      else if(filter(workList.head))
        recFilter(workList.tail, workList.head :: filteredList)
      else 
        recFilter(workList.tail, filteredList) // 补全条件不满足的分支,直接处理剩余元素
    }

    recFilter(listToSort, List())
  }
}
修改说明
  • 补全了所有条件分支:新增else分支处理过滤条件不满足的场景,保证所有执行路径的返回值都是List[String],解决类型不匹配报错。
  • 递归终止时调用reverse方法反转累积的结果列表,把头插导致的逆序恢复为原列表的元素顺序,输出符合预期。

内容的提问来源于stack exchange,提问作者Piotr Kowalczyk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 01:57:00