可以说我有一个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