Scala在嵌套List中查找元素

时间:2016-01-28 15:10:31

标签: scala

考虑以下示例:

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)
}

是否有更高效,更优雅(和功能性)的方法来实现这一目标?

5 个答案:

答案 0 :(得分:6)

您可以尝试:

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

答案 1 :(得分:1)

您可以使用flatMapfind

families.flatMap(fam => fam.members).find(m => m.name == name)

答案 2 :(得分:1)

使用像这样的理解,

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

即为每位家庭成员挑选名称符合要求的人。

答案 3 :(得分: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

答案 4 :(得分:0)

如果你想找到这个家庭。

families.find(f => f.members.exists(_.name == name))