2017-04-25 108 views
6

创建从列表,并附有地图和内部列表,所以我有数据类是这样的:如何使用科特林

data class Item(val name: String) 
data class Order(val id: Int, val items: List<Item>) 

,我有订单的列表。

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

+0

'associateTo' /'associateBy'是你的朋友。 –

回答

3

既然你有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 }它们收集到时变换项目Ť他列出,它需要从一对订单。

(runnable demo of this code)

如果你想消除的情况下,同一个Order的多次出现它包含一个Item多次使用distinct如下:.flatMap { o -> o.items.distinct().map { i -> ... } }

+0

谢谢@hotkey!这绝对有效! 现在我想知道如果我们使用associateTo/associateBy @Oliver Charlesworth提到的,我们是否可以有一个更简单的解决方案。 – lawkai

+0

@lawkai,我对此表示怀疑。 'associate *'函数只能将一系列的项目转换成一个映射,其中每个条目以某种方式从其中一个项目产生。至少,我没有看到使用'associate *'的简单解决方案,它可以做到这一点。 @OliverCharlesworth,请你详细说明一下吗? – hotkey

+0

我误解了OP的意图 - “associate *”方法在这里不太可能有用:/ –