给出一个scala列表,例如:
List( ~(OuterObj,InnerObj1), ~(OuterObj, InnerObj2), ...)
如果所有OuterObj都相同且InnerObj可能不同,我需要" group"这是一个包含InnerObj列表的OuterObj对象。
换句话说,OuterObj
的属性innerList
为空,但我需要将原始列表转换为单个OuterObj,以便:
OuterObj.innerList = List(InnerObj1, InnerObj2, ....)
我尝试使用.groupBy(_._1)
,但这并没有正确分组对象,我也不确定从那里开始。
如果上下文有帮助,原始List是使用以下解析器模式的一对多(1 outerObj到多个innerObj)的Anorm连接查询的结果:
SQL(" joining outer on inner sql using a left join.. ").as(OuterObj.parse ~ InnerObj.parse *) // this is what creates the list of tuples
答案 0 :(得分:4)
tuples // List[(A, B)]
.groupBy(_._1) // Map[A , List[(A, B)]
.mapValues(_.map(_._2)) // Map[A, List[B]]
.toList // List[(A, List[B])]
.map{ case (parent, children) =>
parent.copy(
innerList = children
)
} // List[A]
使用外连接你真的应该选择性地解析内部对象,否则你会在没有内部对象的情况下丢失行(除非这是所需的效果)。在这种情况下,您可以:
SQL(...).as(OuterObj.parse ~ (InnerObj.parse ?) *) // List[(A, Option[B])]
.groupBy(_._1) // Map[A , List[(A, Option[B])]
.mapValues(_.map(_._2)) // Map[A, List[Option[B]]]
.toList // List[(A, List[Option[B]])]
.map{ case (parent, children) =>
parent.copy(
innerList = children.flatten
)
} // List[A]