Scala查找嵌套列表中的元素

3
考虑以下示例:
case class Person(name: String, age: Int)
case class Family(surname: String, members: List[Person])

val families = List(
  Family("Jones",
    List(Person("Indiana", 50), Person("Molly", 20))),
  Family("Black",
    List(Person("Jack", 55), Person("Derek", 12))))

我希望编写一个函数,用于在List [Family]对象中查找具有特定姓名的人。这是我当前的解决方案:

def find(name: String, families: List[Family]): Option[Person] = {
  families.find(f => f.members.exists(m => m.name == name)).map(f => f.members.find(m => m.name == name).get)
}

有没有更高效、更优雅(并且功能更强大)的方法来实现这个目标?

families.flatMap(_.members).find(_.name == name)完成了任务。但是你的数据模型选择似乎不太合适,因为无法获取Person的姓氏。 - undefined
@ziggystar 这取决于你想如何处理它,可以参考我下面的回答。 - undefined
5个回答

7

你可以尝试以下方法:

families.flatMap(_.members).find(_.name == name)

假设你只想找到第一个匹配项,那么效率不是更低吗? - undefined

2

使用类似这样的for推导式:

for (f <- families; m <- f.members if m.name == name) yield m

具体而言,针对每个家庭成员选择符合要求的姓名。


1
你可以使用 flatMapfind
families.flatMap(fam => fam.members).find(m => m.name == name)

0

从功能上讲,我更喜欢这种方式(还添加了姓氏,你可能需要它,这会使事情变得有点复杂):

families.flatMap { f => f.members
                         .find(_.name == "Molly")
                         .map { m => (f.surname, m.name) }}
        .headOption
//> res0: Option[(String, String)] = Some((Jones,Molly))

如果你想要所有拥有给定名字的人,只需将.find替换为.filter并移除.headOption

0
如果你只想找到家庭。
families.find(f => f.members.exists(_.name == name))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接