从列表中发出每个项目

emitting each item from list

我有一个像这样的 DAO 方法,它运行良好:

@Query("SELECT name FROM Weather")
Single<List<String>> getCity();

还有我的方法 activity:

mDatabase.getWeatherDao().getCity()
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .flatMap(new Function<List<String>, SingleSource<String>>() {
                @Override
                public SingleSource<String> apply(List<String> strings) throws Exception {
                    return ....; 
                }
            })
            .distinct()

下一个过滤器等等。

如何在 apply 方法中发出 List<String> 字符串中的每个项目,以便我可以删除重复的 (distinct()) 项目、过滤然后使用方法 toList()

你必须 flatMap 一个 Observable,像这样:

.flatMapObservable(new Function<ArrayList<String>, ObservableSource<? extends String>>() {
    @Override
    public ObservableSource<? extends String> apply(ArrayList<String> source) throws Exception {
        return Observable.fromIterable(source);
    }
})

如果您可以使用 lambda 表达式和方法引用,您可以将所有仪式替换为以下之一:

// Lambda version
.flatMapObservable(source -> Observable.fromIterable(source))
// Method reference version
.flatMapObservable(Observable::fromIterable)

您也可以尝试这样的操作:

mDatabase.getWeatherDao().getCity()
                .toObservable()
                .flatMapIterable(r -> r)
                .distinct()
                .toList()
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(..., ...)

这将 "as is" 用于字符串,对于更复杂的对象,您需要确保散列和等于(列表中实体的)工作正确。