Java 在不使用toList()的情况下合并两个观测值,因为引擎盖下有SQLBrite
1) 我有一个方法Observable>moviesWithoutGenres(),它返回电影列表,但电影的类型字段为空 2) 我有一个方法Observable>movieGenres(moviem),它返回指定字段的类型列表 我需要实现一个应该返回Observable>的方法,列表中的每一部电影都有一个类型列表 我已经实现了这样的流,但我的解决方案是使用Observable.from()将其转换为Observable,使用toList()操作符将其转换为Observable。这种解决方案是不可接受的,因为我在第一种方法的框架下使用SQLBrite包装器进行反应式sql查询。未调用onCompleted,因为流始终保持打开状态,因此对sql表的更改可以传播到所有订阅服务器。因此,无法执行toList运算符Java 在不使用toList()的情况下合并两个观测值,因为引擎盖下有SQLBrite,java,android,sqlite,system.reactive,sqlbrite,Java,Android,Sqlite,System.reactive,Sqlbrite,1) 我有一个方法Observable>moviesWithoutGenres(),它返回电影列表,但电影的类型字段为空 2) 我有一个方法Observable>movieGenres(moviem),它返回指定字段的类型列表 我需要实现一个应该返回Observable>的方法,列表中的每一部电影都有一个类型列表 我已经实现了这样的流,但我的解决方案是使用Observable.from()将其转换为Observable,使用toList()操作符将其转换为Observable。这种解决方案是不可
public class Movie {
private String id;
private String title;
private List<String> genres;
...
}
公共类电影{
私有字符串id;
私有字符串标题;
私人列表体裁;
...
}
1) 无类型的可观察电影()代码>
2) 可观察的电影类型(电影m)代码>
应实施:
可观察电影()代码>公众可观看电影(){
返回无类型电影()
.switchMap(movies->Observable.from(movies)//这是一个可观察的
.concatMap(电影->电影类型(电影)
.first()
.map(类型->新电影(Movie.id、Movie.title、类型)))
.toList());
}
Observable.from()将发出列表中的项,后跟一个onComplete()。诀窍在于,由于电影类型是一个无止境的可观察对象,所以必须首先()调用它,以便调用onComplete(),然后toList()将正常工作感谢您的响应。尽管“Observable.from(movies)”一行有很多电影,但该解决方案提供了一个电影列表。我不知道是什么导致了这个问题。出于某种原因,使用“concatMap()”而不是“switchMap()”解决了这个问题。你能更新答案吗?原因是如果从源可观察对象发出新值,switchMap
不会发出任何东西(在这种情况下,源可观察对象是observable.from(movies)
,因此它可能只发出最后一部电影,因为这是唯一一部不会被中断的电影。
public Observable<List<Movie>> movies() {
return moviesWithoutGenres()
.switchMap(movies -> Observable.from(movies) // This is an Observable<Movie>
.concatMap(movie -> movieGenres(movie)
.first()
.map(genres -> new Movie(movie.id, movie.title, genres)))
.toList());
}