How to transform each element from Flow<List<User>> and return new Flow<List<UserWithNumber>>

Viewed 577

The difficulty is that I get the number wrapped in a flow.

Implementation of UserWithNumber

data class UserWithNumber(val user: User, val number: Int)

Implementation of users functions:

fun getUsers(): Flow<List<User>> {
    //return users
}

fun getNumberForUser(userId: Long): Flow<Int> {
    //return number
}

fun getUsersWithNumber(): Flow<List<UserWithNumber>> {
    return getUsers()
        //TODO transform every User to UserWithNumber
}

in RxJava i can easily achieve that with flatMapIterable and toList().

fun getUsersWithNumber(): Observable<List<UserWithNumber>> {
    return getUsers() // return Observable<List<User>>
        .flatMapIterable { it } // unfolds list in Observable<User>
        .flatMap { it.getNumberForUser(it.id) } // make transform function to every user
        .toList() // wrap to list
}

How to do that with kotlin coroutines?

1 Answers

I think you should be able to do something like this:

fun getUsersWithNumber(): Flow<List<UserWithNumber>> {
    return getUsers().map { userList ->
        userList.map { user ->
           // transform User to UserWithNumber here 
           // (possibly with an extension function?)
        }
    }
}

The only thing I'm not sure is how you want to do the transformation, since based on what you've posted you have getNumberForUser which returns a Flow<Int>, not a Flow<UserWithNumber>.

Related