可以說我有一個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
保留屬性propX
。 propX
只能是幾個值,我需要的是一個Map
,它根據此值對TraitB
的實例進行分組。
所以我需要提取是從List[TraitA]
實例TraitB
實例的這個子集,因爲他們中的一些TraitA with TraitB
,並創建一個Map[String, List[TraitB]]
,這裏的關鍵是從TraitA
propX
。
我一直在擺弄周圍有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
知名度。
實現此目標的最佳方法是什麼?
我不明白你的問題。你能舉一個真實值的例子來說明它最終的樣子嗎? – sschaef
那麼它有點難以粘貼完整的場景。我會試着澄清一點以上。 – jbx