【问题标题】:RxJava 1.x .zip() not working on RxJava 2.0RxJava 1.x .zip() 不适用于 RxJava 2.0
【发布时间】:2017-06-25 04:28:02
【问题描述】:

我正在尝试使用 RxJava + Retrofit + Kotlin 来学习链式请求。 我正在学习的教程是使用 RxJava 1.x,所以当我尝试使用 RxJava 2.x 重新实现时,我无法让 .zip() 工作。

这是一个使用 Star Wars API 的简单应用,返回电影列表,ando 为每部电影获取角色。

fun loadMoviesFull(): Observable<Movie> {
    return service.listMovies()
            .flatMap { filmResults -> Observable.from(filmResults.results) }
            .flatMap { film ->
                Observable.zip(
                        Observable.just(Movie(film.title, film.episodeId, ArrayList<Character>())),
                        Observable.from(film.personUrls)
                                .flatMap { personUrl ->
                                    service.loadPerson(Uri.parse(personUrl).lastPathSegment)
                                }
                                .map { person ->
                                    Character(person!!.name, person.gender)
                                }
                                .toList(),
                        { movie, characters ->
                            movie.characters.addAll(characters)
                            movie
                        })
            }
}

如果您想查看教程的完整实现,这是链接(cmets 是葡萄牙语): http://www.nglauber.com.br/2017/03/rxjava-kotlin-retrofit-star-wars-api.html

我只想知道 ir 的语法,因为我无法在 2.x 上实现。

非常感谢你,我很抱歉我的英语不好。

【问题讨论】:

    标签: android kotlin rx-java2


    【解决方案1】:

    我不知道编译器会产生什么错误,但很可能你的函数应该返回Observable&lt;List&lt;Movie&gt;&gt;zipBiFunction 需要显式传递类型并且最后不应该有单个movie。最后当然还有.toList()

    完整代码:

    fun loadMoviesFull(): Observable<List<Movie>> {
        return service.listMovies()
                .flatMap { filmResults -> Observable.from(filmResults.results) }
                .flatMap { film ->
                    Observable.zip(
                            Observable.just(Movie(film.title, film.episodeId, ArrayList<Character>())),
                            Observable.from(film.personUrls)
                                    .flatMap { personUrl ->
                                        service.loadPerson(Uri.parse(personUrl).lastPathSegment)
                                    }
                                    .map { person ->
                                        Character(person!!.name, person.gender)
                                    }
                                    .toList(),
                            BiFunction<Movie, Character, Movie>{ movie, characters ->
                                movie.characters.addAll(characters)
                            })
                }.toList()
    }
    

    【讨论】:

      【解决方案2】:

      由于声誉不足,它不会让我添加评论,因此发布作为答案。你在用rxkotlin吗?有许多帮助函数,包括Observable.zip(),可帮助解决使用 Rx2 时的 SAM 歧义问题。在不知道你的错误是什么的情况下,这是我能给出的最好建议。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多