2016-01-28 95 views
2

請看下面的例子:斯卡拉找到元素嵌套列表

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

是否有更高效和優雅(和功能)的方式來實現這一目標?

+0

'families.flatMap(_。members).find(_。name == name)'做這項工作。但是你的數據模型顯得很糟糕,因爲沒有辦法得到'Person'的姓氏。 – ziggystar

+0

@ziggystar取決於你想如何處理它,看到我的答案在下面 –

回答

6

你可以試試:

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

你可以只使用flatMapfind

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

功能,我寧願這樣(加姓太,你可能需要它,它使一個比較複雜):

​​

如果你想要所有的p具有給定名稱eople,只需用.filter替換.find和除去.headOption

1

使用像這樣理解,

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

即對於每個家庭成員挑選那些其名稱是任意的。

0

如果你想找到家人。

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