如何使用科特林
创建从列表,并附有地图和内部列表,所以我有数据类是这样的:如何使用科特林
data class Item(val name: String)
data class Order(val id: Int, val items: List<Item>)
,我有订单的列表。
我的问题是,如何使用Kotlin的集合API创建一个包含项目名称作为关键字和该项目作为值的订单列表的地图?
既然你有orders: List<Order>
,可以先flatMap
订单进入Order
对和项目名称(这样,如果有一个以上的Item
每个Order
可发生多次),并通过该项目名称,然后组这些对使用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 -> ... } }
谢谢@hotkey!这绝对有效! 现在我想知道如果我们使用associateTo/associateBy @Oliver Charlesworth提到的,我们是否可以有一个更简单的解决方案。 – lawkai
@lawkai,我对此表示怀疑。 'associate *'函数只能将一系列的项目转换成一个映射,其中每个条目以某种方式从其中一个项目产生。至少,我没有看到使用'associate *'的简单解决方案,它可以做到这一点。 @OliverCharlesworth,请你详细说明一下吗? – hotkey
我误解了OP的意图 - “associate *”方法在这里不太可能有用:/ –
'associateTo' /'associateBy'是你的朋友。 –