2017-01-17 61 views
-3

大家好!需要找到對象的最佳方式

我有3類:

case class Foo(id: String, bars: Option[List[Bar]]) 
case class Bar(id: String, buzzes: Option[List[Buz]]) 
case class Buz(id: String, name: String) 

和收集:

val col = Option[List[Foo]] 

我需要得到:

val search: String = "find me" 
val (x: Option[Foo], y: Option[Bar], z: Option[Buz]) = where buz.name == search ??? 

請幫助:)

UPD: 我有JSON

{ 
    "foos": [{ 
     "id": "...", 
     "bars": [{ 
      "id": "...", 
      "buzzes": [{ 
       "id": "...", 
       "name": "find me" 
      }] 
     }] 
    }] 
} 

和當代語境中的名稱將是唯一的。通過與BUZ名==搜索

{ 
    (foo)(bar)(buz), 
    (foo)(bar)(buz), 
    (foo)(bar)(buz) 
} 

和過濾但是,我不`噸知道如何:):像這樣 -

我首先想到的是 - 轉變成集的元組的列表

+2

如果多個'Buz'元素具有目標'name'值會怎麼樣?爲什麼'Option'每個元組成員? 'Option [(Foo,Bar,Buz)]''是不是更有意義?沒有單個成員的元組可以是'沒有',如果他們都不是'沒有'。 – jwvh

+0

增加了一些解釋 – HoTicE

回答

1

這裏的一個大問題是,在挖掘到足夠遠以找到要查找的內容之後,結果類型將反映類型的迷霧:Option[List[Option[List...etc

將發現作爲副作用保存起來會更容易(不一定更好)。

val bz1 = Buz("bz1", "blah") 
val bz2 = Buz("bz2", "target") 
val bz3 = Buz("bz3", "bliss") 

val br1 = Bar("br1", Option(List(bz1,bz3))) 
val br2 = Bar("br2", None) 
val br3 = Bar("br3", Option(List(bz1,bz2))) 

val fo1 = Foo("fo1", Option(List(br1,br2))) 
val fo2 = Foo("fo2", None) 
val fo3 = Foo("fo3", Option(List(br2,br3))) 

val col: Option[List[Foo]] = Option(List(fo1,fo2,fo3)) 

import collection.mutable.MutableList 
val res:MutableList[(String,String,String)] = MutableList() 

col.foreach(_.foreach(f => 
    f.bars.foreach(_.foreach(br => 
    br.buzzes.foreach(_.collect{ 
     case bz if bz.name == "target" => res.+=((f.id,br.id,bz.id))}))))) 

res // res: MutableList[(String, String, String)] = MutableList((fo3,br3,bz2))