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