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
相关产品推荐
相关产品推荐

