如何在 Android 中使用 kotlin 流的 Zip 运算符
How to use Zip operator of kotlin flow in Android
在我的应用程序中,我想将两个不同的 API 与 Kotlin flow
的 ZIP
运算符结合起来 flow
.!
Api 1 是 电影列表 并且 Api 2 是 流派列表!
我想一次加载每个 2 Apis,为此我使用了 zip
运算符!
我的工作是真的吗?我可以将 2 个不同的 Api 与它们合并吗?
Api服务:
interface ApiServices {
@GET("movies")
suspend fun moviesList(): Response<MoviesList>
@GET("genres")
suspend fun genresList(): Response<GenresList>
}
存储库class:
class Repository @Inject constructor(private val api: ApiServices) {
suspend fun moviesList(): Flow<Response<MovieList>> {
return flow {
emit(api.moviesList(1))
}
}
suspend fun genresList(): Flow<Response<GenresList>> {
return flow {
emit(api.genresList())
}
}
}
我知道在 moviesList 中添加不同模型 class 显示错误!
但我想知道如何使用 Zip
运算符来组合 2 个不同的 Apis?
您可以使用 combine(flow1,flow2)
方法组合 flow
并使用 zip
压缩您的 api 响应,例如:
class ViewModel @Inject constructor(private val repository: Repository) : ViewModel() {
val moviesFlow = repository.moviesList()
val genresFlow = repository.genresList()
fun loadMoviesAndGenres() : Flow<List<Pair<Type1,Type2>>> = combine(moviesFlow, genresFlow) { movieList: Response<MovieList>, genreList:Response<GenresList> ->
val movies = movies.body()?.data
val genres = genres.body()
return@combine movies?.zip(genres)
}
}
如何使用zip
:
val listMovieTittle = listOf("avanger", "conjuring", "other")
val listGenre = listOf("action", "horror", "fantasy", "thriller")
val result1 : List<Pair<String,String>> = listMovieTittle .zip(listGenre)
println(result1 ) // [(avanger, action), (bconjuring, horror), (other, fantasy)]
val result2 : List<String> = listMovieTittle .zip(listGenre) { a, b -> "$a + $b" }
println(result2) // [avanger + action, conjuring + horror, other + fantasy]
在我的应用程序中,我想将两个不同的 API 与 Kotlin flow
的 ZIP
运算符结合起来 flow
.!
Api 1 是 电影列表 并且 Api 2 是 流派列表!
我想一次加载每个 2 Apis,为此我使用了 zip
运算符!
我的工作是真的吗?我可以将 2 个不同的 Api 与它们合并吗?
Api服务:
interface ApiServices {
@GET("movies")
suspend fun moviesList(): Response<MoviesList>
@GET("genres")
suspend fun genresList(): Response<GenresList>
}
存储库class:
class Repository @Inject constructor(private val api: ApiServices) {
suspend fun moviesList(): Flow<Response<MovieList>> {
return flow {
emit(api.moviesList(1))
}
}
suspend fun genresList(): Flow<Response<GenresList>> {
return flow {
emit(api.genresList())
}
}
}
我知道在 moviesList 中添加不同模型 class 显示错误!
但我想知道如何使用 Zip
运算符来组合 2 个不同的 Apis?
您可以使用 combine(flow1,flow2)
方法组合 flow
并使用 zip
压缩您的 api 响应,例如:
class ViewModel @Inject constructor(private val repository: Repository) : ViewModel() {
val moviesFlow = repository.moviesList()
val genresFlow = repository.genresList()
fun loadMoviesAndGenres() : Flow<List<Pair<Type1,Type2>>> = combine(moviesFlow, genresFlow) { movieList: Response<MovieList>, genreList:Response<GenresList> ->
val movies = movies.body()?.data
val genres = genres.body()
return@combine movies?.zip(genres)
}
}
如何使用zip
:
val listMovieTittle = listOf("avanger", "conjuring", "other")
val listGenre = listOf("action", "horror", "fantasy", "thriller")
val result1 : List<Pair<String,String>> = listMovieTittle .zip(listGenre)
println(result1 ) // [(avanger, action), (bconjuring, horror), (other, fantasy)]
val result2 : List<String> = listMovieTittle .zip(listGenre) { a, b -> "$a + $b" }
println(result2) // [avanger + action, conjuring + horror, other + fantasy]