如何使用Kotlin从列表和内部列表创建Map

时间:2017-04-25 14:59:25

标签: kotlin

所以我有这样的数据类:

éàè

我有一份订单清单。

我的问题是,如何使用Kotlin的集合API创建一个带有项目名称作为键的地图和带有该项目作为值的订单列表?

1 个答案:

答案 0 :(得分:7)

假设您有orders: List<Order>,您可以先将flatMap个订单分成Order和项目名称对(这样每个Order可以多次出现,如果有的话多个Item),然后使用groupBy按项目名称对这些对进行分组,将成对的订单分组:

val result = orders
        .flatMap { o -> o.items.map { i -> o to i.name } }
        .groupBy({ (_, name) -> name }, valueTransform = { (o, _) -> o })

groupBy参数中,{ (_, name) -> name }是分组键选择器函数,它从每对中获取名称,{ (o, _) -> o }在将项目收集到列表时转换项目,这需要订单中的订单。

(runnable demo of this code)

如果您希望消除同一Order多次出现多次Item,请多次使用distinct.flatMap { o -> o.items.distinct().map { i -> ... } }