我有一个看起来像这样的列表:
val myList = listOf(
Message(
id= 1,
info = listOf(1, 2)
),
Message(
id= 1,
info = listOf(3, 4)
),
Message(
id= 2,
info = listOf(5, 6)
)
)
如何转换它以便组合具有相同 id 的元素?
listOf(
Message
id= 1
info = listOf(1, 2, 3, 4)
),
Message
id= 2
info = listOf(5, 6)
)
)
我已经尝试了以下,它的工作原理
myList
.groupBy { it.id }
.map { entry ->
val infos = entry.value.fold(listOf<Int>()) { acc, e -> acc + e.info }
Message(
id = entry.key,
info = infos
)
}
但我想知道是否有更简单/更干净/更惯用的方式来合并这些对象。似乎我可以用一个折叠来做到这一点,但我无法将我的大脑包裹在它周围。
谢谢
也可以通过(比较)groupingBy
做一些不同的事情:fold
Grouping
myList.groupingBy { it.id }
.fold({ _, _ -> mutableListOf<Int>() }) { _, acc, el ->
acc.also { it += el.info }
}
.map { (id, infos) -> Message(id, infos) }
这样,您只有 1 个中间映射,每个键只有 1 个中间列表,这会累积您的值。最后,您将其转换为您需要的形式(例如转换为 a Message
)。也许你甚至不需要那个?也许地图已经是你所追求的?
在这种情况下,您可能希望使用以下内容(即缩小值的可变列表类型):
val groupedMessages : Map<Int, List<Int>> = myList.groupingBy { it.id }
.fold({ _, _ -> mutableListOf() }) { _, acc, el ->
acc.also { it += el.info }
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句