2014-02-15 50 views
0

可以說我有一個List[TraitA]的對象。 TraitA提供了一個屬性propX : String。 我知道該列表的一個子集也是TraitB的一個實例,但它不提供屬性propX將列表映射到另一個特徵的地圖的最佳方法

因此,例如:

trait TraitA 
{ 
    def propX : String 
} 

trait TraitB 
{ 
    def abc : Int 
} 

一些列表只是extend TraitA的情況下,而另一些extend TraitA with TraitB。我只需要提取那些具有TraitB的實例,但我需要從TraitA保留屬性propXpropX只能是幾個值,我需要的是一個Map,它根據此值對TraitB的實例進行分組。

所以我需要提取是從List[TraitA]實例TraitB實例的這個子集,因爲他們中的一些TraitA with TraitB,並創建一個Map[String, List[TraitB]],這裏的關鍵是從TraitApropX

我一直在擺弄周圍有for內涵,但由於某種原因,我不能yield元組的List[(String, TraitB)](這我可以再groupBy _.1),可能是因爲第一發電機TraitA類型。

我想這一點,但它抱怨說,預期的類型是List[(String, TraitA)]

for { 
traitA <- listOfTraitAs 
traitBoption = (traitA match { 
    case traitB : TraitB => Some(traitB) 
    case _ => None 
    }) 
} yield (traitA.propX, traitBoption) 

在另一方面,如果我通過圖案TraitB匹配filter列表中我失去了過濾功能的propX知名度。

實現此目標的最佳方法是什麼?

+0

我不明白你的問題。你能舉一個真實值的例子來說明它最終的樣子嗎? – sschaef

+0

那麼它有點難以粘貼完整的場景。我會試着澄清一點以上。 – jbx

回答

2

我不明白爲什麼filter不會爲你工作:

scala> trait TraitA { def propX: String }; trait TraitB { def abc: Int } 
defined trait TraitA 
defined trait TraitB 

scala> class A extends TraitA { def propX = util.Random.nextInt(5).toString() } 
defined class A 

scala> class B extends A with TraitB { def abc = util.Random.nextInt(5) } 
defined class B 

scala> val xs: List[TraitA] = List.fill(15)(if (util.Random.nextBoolean()) new A else new B) 
xs: List[TraitA] = List([email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected]) 

scala> xs collect { case a: TraitB => a } groupBy (_.propX) 
res7: scala.collection.immutable.Map[String,List[TraitA with TraitB]] = Map(4 -> List([email protected], [email protected]), 1 -> List([email protected]), 0 -> List([email protected]), 2 -> List([email protected], [email protected]), 3 -> List([email protected])) 

即使你鬆的知名度,你總是可以做模式匹配的東西,如{ case a: TraitA with TraitB => }

+0

哦,我不知道當你做'groupBy'之類的東西時,你仍然可以看到舊的類型!感謝那! – jbx

相關問題