可以说我有一个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理解,但由于某种原因,我不能yielda 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
实现这一目标的最佳方法是什么?