Как я могу объединить три списка в один объект в Kotlin - PullRequest
0 голосов
/ 23 января 2020

Я пытаюсь объединить три списка объектов в один объект с kotlin. Но я не знаю, как это сделать ...

Будет полезна помощь.

Это мой класс данных:

data class User(
    val address: Address,
    val company: Company,
    val email: String,
    val id: Int,
    val name: String,
    val phone: String,
    val username: String,
    val website: String
)

data class Post(
    val body: String,
    val id: Int,
    val title: String,
    val userId: Int
)

data class Comment(
    val body: String,
    val email: String,
    val id: Int,
    val name: String,
    val postId: Int
)

Что я хочу сделать, это получить один объект, как это возможно, если это возможно:

data class PostJoin(body: String, id: Int, title; String, user: User, comments: List<Comment>)

Это то, что я пытаюсь сделать, могу смешивать только два объекта, но не так, как я хочу.

val postUsers = post.joinBy(users) { (post,user) -> post.userId == user.id }
                                    .map { PostViewModel(post = it.first, user = it.second) }

private inline fun <T : Any, U : Any> List<T>.joinBy(collection: List<U>, filter: (Pair<T, U>) -> Boolean): List<Pair<T, List<U>>> = map { t ->
        val filtered = collection.filter { filter(Pair(t, it)) }
        Pair(t, filtered)
    }

1 Ответ

1 голос
/ 23 января 2020

Что-то вроде этого может работать:

val posts: List<Post> 
val users: List<User>
val comments: List<Comment>

// initialize lists
...

val joinedPosts = posts.fold(ArrayList<PostJoin>()) { joinedPosts, post ->
    val postComments = comments.filter { it.postId == post.id }
    val user = users.first { it.id == post.userId } 

    joinedPosts.add(PostJoin(post.body, post.id, post.title, user, postComments))
    joinedPosts
}

Кажется, работает для меня: Попробуйте онлайн! . Хотя я довольно ленивый ввод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...