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

law*_*kai 8 kotlin

所以我有这样的数据类:

data class Item(val name: String)
data class Order(val id: Int, val items: List<Item>)
Run Code Online (Sandbox Code Playgroud)

我有一份订单清单.

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

hot*_*key 8

鉴于你有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 })
Run Code Online (Sandbox Code Playgroud)

groupBy参数中,{ (_, name) -> name }是分组键选择器函数,它从每对中获取名称,并在{ (o, _) -> o }将它们收集到列表时转换项目,它从该对中获取顺序.

(此代码的runnable演示)

如果要在多次Order包含单个事件的情况下消除Item多次出现,请使用distinct以下命令:.flatMap { o -> o.items.distinct().map { i -> ... } }