【问题标题】:How to join three lists into a single Object如何将三个列表连接到一个对象中
【发布时间】:2022-01-01 23:05:24
【问题描述】:

如何在单个对象中根据 userId 转换三个列表,其中每个对象都将尊重的列表对象作为变量。

data class User(val id: String)
data class Book(val id: String, val userId: String)
data class Order(val id: String, val userId: String)

输入

val users: List<User> = listOf(
    User(id = "u1"),
    User(id = "u2"),
    User(id = "u3")
)
val books: List<Book> = listOf(
    Book(id = "b1.u1", userId = "u1"),
    Book(id = "b2.u1", userId = "u1"),
    Book(id = "b3.u2", userId = "u2"),
    Book(id = "b4.ux", userId = "ux")
)

val order: List<Order> = listOf(
    Order(id = "o1", userId = "u1"),
    Order(id = "o2", userId = "u1"),
    Order(id = "03", userId = "u2"),
    Order(id = "o4", userId = "u1")
)

输出

val result = listOf(Result(user, book, order))

【问题讨论】:

  • 您预期的完整输出是多少?你想要书籍和订单的所有组合吗?好像订单和书之间没有联系。

标签: kotlin functional-programming


【解决方案1】:

您可以通过 userId 对书籍和订单进行分组,然后为每个用户选择相应的书籍和订单。

val booksMap = books.groupBy { it.userId }
val ordersMap = orders.groupBy { it.userId }
users.map {
    Result(
        user = it,
        books = booksMap[it.id] ?: emptyList(),
        orders = ordersMap[it.id] ?: emptyList()
    )
}

这里Result 是:

data class Result(val user: User, val books: List<Book>, val orders: List<Order>)

【讨论】:

    【解决方案2】:

    很难得到你所需要的输出。对我来说,为每个用户获取书籍和订单列表是最有意义的。如果是这种情况,那么您可以这样做:

    data class Result(val user: User, val books: List<Book>, val orders: List<Order>)
    
    val results = users.map { user ->
        val userBooks = books.filter { it.userId == user.id }
        val userOrders = orders.filter { it.userId == user.id }
        Result(user, userBooks, userOrders)
    }
    

    【讨论】:

    • 是的,类似的东西,但是有没有办法避免过滤或链接它们中的每一个,类似于 group by 或 associate by
    猜你喜欢
    • 2019-09-03
    • 1970-01-01
    • 2016-12-20
    • 1970-01-01
    • 1970-01-01
    • 2014-04-02
    • 2023-01-29
    • 1970-01-01
    • 2018-09-25
    相关资源
    最近更新 更多