RX Java 努力将地图运算符与子集一起使用
RX Java struggling to use map operator with a subset
我是 RX 的新手,我已经使用地图运算符有一段时间了。在我的问题中,我正在将 MovieEntity.class 的集合转换为 Movie.class.
的集合
然而,这个 Movie.class 带有一个整数列表,因为它的成员表示这部电影与流派相关。
classes 看起来像这样:
public class MovieEntity{
String name;
List<Integer> genres;
}
public class Movie{
String name;
List<Genre> genres;
}
public class Genre{
String name;
Integer id;
}
@Override
public Observable<List<Movie>> list() {
return getDataSource()
.movieList()
.map(new Function<List<MovieEntity>, List<Movie>>() {
@Override
public List<Movie> apply(List<MovieEntity> movieEntities) throws Exception {
return movieMapper.transform(movieEntities);
}
});
}
我正在尝试找到将仅包含整数 ID 列表的 MovieEntity 转换为 Movie.class 的最佳方法。
当然我有一个 class 可以通过其 id 映射流派参考。
如果这很常见并且我应该使用特定术语进行搜索,请不要犹豫说出来,因为我有点困惑。
有没有标准的方法可以用 RX 解决这个问题?
这最好在 RxJava 之外用传统的 for 循环(或 Java 流)解决:
Map<Integer, Genre> genresMap = ...
List<Movie> result = new ArrayList<Movie>();
for (MovieEntity entity : movieEntities) {
Movie movie = new Movie();
movie.name = entity.name;
movie.genre = new ArrayList<Genre>();
for (Integer genreId : entity.genre) {
movie.genre.add(genresMap.get(genreId));
}
}
return result;
使用 Java 流:
public Observable<List<Movie>> list() {
return getDataSource()
.movieList()
.map(movieList -> movieList.stream()
.map(movieEntity -> {
Movie movie = new Movie();
movie.name = movieEntity.name;
movie.genres = movieEntity.genres.stream()
.map(genreId -> genreMapper(genreId)) // your genre mapper
.collect(Collectors.toList());
return movie;
})
.collect(Collectors.toList())
);
}
使用 RxJava Observable:
public Observable<List<Movie>> list() {
return getDataSource()
.movieList()
.map(movieList -> Observable.fromIterable(movieList)
.map(movieEntity -> {
Movie movie = new Movie();
movie.name = movieEntity.name;
movie.genres = Observable.fromIterable(movieEntity.genres)
.map(genreId -> genreMapper(genreId)) // your genre mapper
.toList().blockingGet();
return movie;
})
.toList().blockingGet()
);
}
我是 RX 的新手,我已经使用地图运算符有一段时间了。在我的问题中,我正在将 MovieEntity.class 的集合转换为 Movie.class.
的集合然而,这个 Movie.class 带有一个整数列表,因为它的成员表示这部电影与流派相关。
classes 看起来像这样:
public class MovieEntity{
String name;
List<Integer> genres;
}
public class Movie{
String name;
List<Genre> genres;
}
public class Genre{
String name;
Integer id;
}
@Override
public Observable<List<Movie>> list() {
return getDataSource()
.movieList()
.map(new Function<List<MovieEntity>, List<Movie>>() {
@Override
public List<Movie> apply(List<MovieEntity> movieEntities) throws Exception {
return movieMapper.transform(movieEntities);
}
});
}
我正在尝试找到将仅包含整数 ID 列表的 MovieEntity 转换为 Movie.class 的最佳方法。
当然我有一个 class 可以通过其 id 映射流派参考。
如果这很常见并且我应该使用特定术语进行搜索,请不要犹豫说出来,因为我有点困惑。
有没有标准的方法可以用 RX 解决这个问题?
这最好在 RxJava 之外用传统的 for 循环(或 Java 流)解决:
Map<Integer, Genre> genresMap = ...
List<Movie> result = new ArrayList<Movie>();
for (MovieEntity entity : movieEntities) {
Movie movie = new Movie();
movie.name = entity.name;
movie.genre = new ArrayList<Genre>();
for (Integer genreId : entity.genre) {
movie.genre.add(genresMap.get(genreId));
}
}
return result;
使用 Java 流:
public Observable<List<Movie>> list() {
return getDataSource()
.movieList()
.map(movieList -> movieList.stream()
.map(movieEntity -> {
Movie movie = new Movie();
movie.name = movieEntity.name;
movie.genres = movieEntity.genres.stream()
.map(genreId -> genreMapper(genreId)) // your genre mapper
.collect(Collectors.toList());
return movie;
})
.collect(Collectors.toList())
);
}
使用 RxJava Observable:
public Observable<List<Movie>> list() {
return getDataSource()
.movieList()
.map(movieList -> Observable.fromIterable(movieList)
.map(movieEntity -> {
Movie movie = new Movie();
movie.name = movieEntity.name;
movie.genres = Observable.fromIterable(movieEntity.genres)
.map(genreId -> genreMapper(genreId)) // your genre mapper
.toList().blockingGet();
return movie;
})
.toList().blockingGet()
);
}