压平Anorm元组列表

时间:2014-06-19 19:56:08

标签: scala anorm

给出一个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

1 个答案:

答案 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]