gpt4 book ai didi

function - Kotlin:将对象列表转换为对象属性映射

转载 作者:行者123 更新时间:2023-12-03 00:19:24 24 4
gpt4 key购买 nike

具有以下数据类:

data class Photo(val id: String)
data class Album(val id: String, val photos: List<Photo>)

我希望能够打开 Albums 的列表进入 Map<photoId, Set<albumId>> 的 map

例如:

val albums = listOf(
Album("1", listOf(
Photo("1"),
Photo("2"),
Photo("3")
)),
Album("2", listOf(
Photo("1"),
Photo("2")
))
)

将转变为:

val map = mapOf(
Pair("1", setOf("1", "2")),
Pair("2", setOf("1", "2")),
Pair("3", setOf("1")
)

有没有办法使用 kotlin 转换函数/lambda 来做到这一点?例如,groupBy、flatMap?

最佳答案

更清洁的解决方案

val grouped = albums
.flatMap { album -> album.photos.map { photo -> Pair(photo.id, album.id) } }
.groupBy( { (photoId, _) -> photoId }, { (_, albumId) -> albumId } )
.mapValues { it.value.toSet() }

并检查正确性

val map = mapOf(
Pair("1", setOf("1", "2")),
Pair("2", setOf("1", "2")),
Pair("3", setOf("1"))
)

check(map == grouped) // Success

一些解释

  • 第一个flatMap我们将 albums 列表 ( List<Album> ) 转换为 List<Pair<String, String>> ( photo.idalbum.id )。

  • groupBy我们将第二个列表转换为 Map<String, List<String>>其中关键是 photo.id并按 album..id 分组

  • mapValues我们将 map 转换为Map<String, Set<String>>

关于function - Kotlin:将对象列表转换为对象属性映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53736412/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com