2014-02-15 23 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

相关问题