Scala中的Tail Recursion在每次丢弃List Head后都会返回它

rsl1atfo  于 2023-03-30  发布在  Scala
关注(0)|答案(1)|浏览(116)

我有一个用户列表。每个用户可能有一个字段users(如朋友)。对于每个用户,我想得到与该用户相关的用户,并返回每次的名称。像一些递归函数。

case class User(users : List[User])
val users: List[User]

对于每个用户,我希望一次获取一个用户名,因为它将用于构造其他内容。
这就是我尝试的方法=〉

private def helper = {
   users.users.map(u => getName(u))

}

这将返回表示userNames的List[String]
我想要实现的是为每个用户返回一个name: String,每个用户在调用函数时都有用户,直到没有用户为止。

ejk8hzay

ejk8hzay1#

你的问题令人困惑。
首先,我不确定users.users是什么。是user.users(对于val user: User)还是users.map(_.users)?对于val users: List[User]users.users不能编译。
其次,我不太清楚下面的话是什么意思
我想实现的是返回一个name: String
如果我没理解错的话你有一个功能

def getName(u: User): String = ???

每个用户都有自己的名字,他的朋友也有自己的名字。你在做什么把很多名字变成一个名字?

val names: List[String]                = users.map(getName(_))
val friendNames: List[List[String]]    = users.map(_.users.map(getName(_)))
val friendNamesFlattened: List[String] = users.flatMap(_.users.map(getName(_)))

你想 * 返回 * 一个名字还是 * 打印 * 一个名字(一次一个)?如果是后者,那么你只需要添加.foreach

users.flatMap(_.users.map(getName(_))).foreach(println)

或者,返回一个名字可能只是指像上面的.flatMap一样进行扁平化。

val friendNamesFlattened: List[String] = friendNames.flatten

代替.map/.flatMap等,你可以使用for-comprehension

val friendNamesFlattened: List[String] =
  for {
    user   <- users
    friend <- user.users
  } yield getName(friend)
for {
  user   <- users
  friend <- user.users
} println(getName(friend))
for {
  user   <- users
  friend <- user.users
  name   =  getName(friend)
} println(name)

我也不知道你说的
Scala中的Tail Recursion在每次丢弃List Head后都会返回它

相关问题