Scala实现尾递归遍历嵌套User列表,每次返回单个用户名
解决方案
首先注意:你的User类定义缺少用户名字段,要实现获取用户名的逻辑,必须补充name属性,修正后的类定义如下:
case class User(name: String, users: List[User]) val users: List[User] // 顶层用户列表
要实现“每次调用返回单个用户名,直到遍历完所有关联用户”的需求,最适合用惰性迭代器(Iterator)——它会按需递归遍历用户结构,每次调用next()返回单个用户名,而非一次性生成全部结果。
递归遍历实现
// 递归遍历单个用户及其所有嵌套好友,返回用户名迭代器 private def traverseUser(user: User): Iterator[String] = { // 先返回当前用户的名字,再拼接其所有好友的遍历结果 Iterator(user.name) ++ user.users.flatMap(traverseUser) } // 生成包含所有顶层用户及关联用户的用户名迭代器 private val allUserNames: Iterator[String] = users.flatMap(traverseUser).iterator
使用方式
通过hasNext判断是否还有未遍历的用户名,调用next()获取单个用户名:
while (allUserNames.hasNext) { val singleUserName = allUserNames.next() // 在这里执行你的构造逻辑,比如传入其他方法处理 println(singleUserName) }
为什么不用List?
你之前的代码用map返回List[String],会一次性把所有用户名加载到内存中。而迭代器是惰性计算的,只有在调用next()时才会递归遍历下一个用户,更适合需要逐个处理、避免内存占用过高的场景,完全符合“每次返回单个用户名”的需求。
内容的提问来源于stack exchange,提问作者Her sincerly
相关产品推荐
相关产品推荐

