如何使用Kotlin从具有和内部列表的列表创建映射

如何使用Kotlin从具有和内部列表的列表创建映射,kotlin,Kotlin,我有这样的数据类: data class Item(val name: String) data class Order(val id: Int, val items: List<Item>) 数据类项(val名称:字符串) 数据类顺序(val id:Int,val项:列表) 我有一份订单清单 我的问题是,如何使用Kotlin的collections API创建以项目名称为键的映射和以该项目为值的订单列表?如果您有订单:列表,您可以首先将订单分成订单和项目名称对(这样,如果每个订

我有这样的数据类:

data class Item(val name: String)
data class Order(val id: Int, val items: List<Item>)
数据类项(val名称:字符串)
数据类顺序(val id:Int,val项:列表)
我有一份订单清单


我的问题是,如何使用Kotlin的collections API创建以项目名称为键的映射和以该项目为值的订单列表?

如果您有
订单:列表
,您可以首先将订单分成
订单
和项目名称对(这样,如果每个
订单
有多个
项目
,则可以多次出现),然后使用项目名称对这些对进行分组,将这些对中的订单分为以下几组:

val result = orders
        .flatMap { o -> o.items.map { i -> o to i.name } }
        .groupBy({ (_, name) -> name }, valueTransform = { (o, _) -> o })
groupBy
参数中,
{({,name)->name}
是一个分组键选择器函数,它从每一对中获取名称,
{(o,{)->o}
在将项目收集到列表时转换项目,它从对中获取顺序


如果要在同一个
顺序包含单个
项的情况下多次消除该顺序的多次出现,请按如下方式使用:
.flatMap{o->o.items.distinct().map{i->…}

associateTo
/
associateBy
是你的朋友。谢谢@hotkey!这肯定有效!现在我想知道,如果我们使用associateTo/associateBy@Oliver Charlesworth提到的associateTo/associateBy,@lawkai,我怀疑它。
associateBy*
函数只能将一系列项目转换成一个地图,其中每个项目条目以某种方式由其中一项生成。至少,我看不到使用
associate*
的简单解决方案也能做到这一点。@OliverCharlesworth,你能详细说明一下吗?我误解了OP的意图-
associate*
方法在这里不太可能有用:/