如何使用Kotlin从List和内部列表中创建一个Map
所以我有这样的数据类:
data class Item(val name: String) data class Order(val id: Int, val items: List<Item>)
我有一个订单清单。
我的问题是,如何使用Kotlin的集合API创建一个包含Item name作为键的映射和具有该Item的Orders列表作为值?
假设您有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 }
将项目收集到列表时进行转换,它采取从一双的顺序。
(此代码的可运行演示)
如果您想消除多次出现同一个Order
的情况(如果它多次包含单个Item
,请使用distinct
,如下所示: .flatMap { o -> o.items.distinct().map { i -> ... } }