Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在不使用toList()的情况下合并两个观测值,因为引擎盖下有SQLBrite_Java_Android_Sqlite_System.reactive_Sqlbrite - Fatal编程技术网

Java 在不使用toList()的情况下合并两个观测值,因为引擎盖下有SQLBrite

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。这种解决方案是不可

1) 我有一个方法Observable>moviesWithoutGenres(),它返回电影列表,但电影的类型字段为空

2) 我有一个方法Observable>movieGenres(moviem),它返回指定字段的类型列表

我需要实现一个应该返回Observable>的方法,列表中的每一部电影都有一个类型列表

我已经实现了这样的流,但我的解决方案是使用Observable.from()将其转换为Observable,使用toList()操作符将其转换为Observable。这种解决方案是不可接受的,因为我在第一种方法的框架下使用SQLBrite包装器进行反应式sql查询。未调用onCompleted,因为流始终保持打开状态,因此对sql表的更改可以传播到所有订阅服务器。因此,无法执行toList运算符

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());
}