可以说我有一个List[TraitA]
对象。TraitA
提供了一个属性propX : String
。我知道这个列表的一个子集也是 的一个实例TraitB
,但是它不提供属性propX
。
例如:
trait TraitA
{
def propX : String
}
trait TraitB
{
def abc : Int
}
列表中的一些实例只是extend TraitA
,而另一些extend TraitA with TraitB
。我只需要提取那些具有TraitB
但我需要保留属性propX
的实例TraitA
。propX
只能是几个值,我需要的是根据这个值Map
对实例进行分组。TraitB
所以我需要TraitB
从List[TraitA]
实例中提取这个实例子集,因为其中一些是TraitA with TraitB
,并创建一个Map[String, List[TraitB]]
,其中密钥propX
来自TraitA
。
我一直在摆弄for
理解,但由于某种原因,我不能yield
a List[(String, TraitB)]
of tuples (那时我可以groupBy _.1
),可能是因为第一个生成器是 type TraitA
。
我试过这个,但它抱怨预期的类型是List[(String, TraitA)]
:
for {
traitA <- listOfTraitAs
traitBoption = (traitA match {
case traitB : TraitB => Some(traitB)
case _ => None
})
} yield (traitA.propX, traitBoption)
另一方面,如果我filter
通过模式匹配列出我在过滤功能中TraitB
失去可见性。propX
实现这一目标的最佳方法是什么?