首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RxJava2 :在可观察的环境中过滤List<Object>

RxJava2 :在可观察的环境中过滤List<Object>
EN

Stack Overflow用户
提问于 2017-09-06 16:28:27
回答 2查看 2.5K关注 0票数 3

我对Rx编程非常陌生,我在一个项目中尝试了一下。我想要的是拥有一个GamesInfoList对象,如下所示:

代码语言:javascript
复制
@AutoValue
public abstract class GameInfoList {
    public static TypeAdapter<GameInfoList> typeAdapter(Gson gson) {
        return new AutoValue_GameInfoList.GsonTypeAdapter(gson);
    }

    public static Builder builder() {
        return new AutoValue_GameInfoList.Builder();
    }

    public abstract long id();

    @Nullable
    public abstract String date_added();

    @Nullable
    public abstract String date_last_updated();

    @Nullable
    public abstract GameImages image();

    @Nullable
    public abstract String name();

    @Nullable
    public abstract List<GamePlatformInfo> platforms();

    @AutoValue.Builder
    public abstract static class Builder {

        public abstract Builder id(long id);

        public abstract Builder date_added(String date_added);

        public abstract Builder date_last_updated(String date_last_updated);

        public abstract Builder image(GameImages image);

        public abstract Builder name(String name);

        public abstract Builder platforms(List<GamePlatformInfo> platforms);

        public abstract GameInfoList build();
    }
}

现在,我想按日期和名称加载我的游戏,并为此编写了一个方法来访问上面的对象。

代码语言:javascript
复制
public void loadGamesByDateAndName(String date, String name) {
    Timber.d("Load games by date: " + date + " and name: " + name);
    remoteDataHelper
            .getGamesListByDate(date)
            .flatMapObservable(Observable::fromIterable)
            .filter(game -> game.platforms() != null)
            .filter(game -> game.platforms().name().contains(name))
            .toList()
            .subscribe(getObserverFiltered(name, false));
}

这里,我根据在此方法中输入的名称(使用filter()操作符)过滤平台对象。上面的方法显示了一个错误,因为platform是List类型的。如何在列表中进行筛选,以匹配我的Android应用程序中的名称和显示?要按日期和名称加载数据,需要对上述方法进行哪些更改?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-09-06 18:45:24

最简单的方法是在第二个filter操作符中迭代。

代码语言:javascript
复制
public void loadGamesByDateAndName(String date, String name) {
    Timber.d("Load games by date: " + date + " and name: " + name);
    remoteDataHelper
            .getGamesListByDate(date)
            .flatMapObservable(Observable::fromIterable)
            .filter(game -> game.platforms() != null)
            .filter(game -> { for(GamePlatformInfo platform : game.platforms()){
                                  if(platform.name().contains(name)) {
                                      return true;
                                  }
                              }
                              return false;
                    }
            )
            .toList()
            .subscribe(getObserverFiltered(name, false));
}
票数 3
EN

Stack Overflow用户

发布于 2017-09-07 05:16:07

您需要在equals()类中重写GamePlatformInfo方法。

我假设您对GamePlatformInfo类有以下类定义:

代码语言:javascript
复制
class GamePlatformInfo{
    String name;
    ...
    ...

    public GamePlatformInfo(String name){
        this.name = name;
        ...
    }

    @Override
    public boolean equals(Object o) {
        if (o == this) return true;
        if (!(o instanceof GamePlatformInfo)) return false;
        final GamePlatformInfo other = (GamePlatformInfo)o;
        return name.equals(other.name);
    }

    @Override
    public int hashCode() {
        int result = 17;
        result = 31 * result + name.hashCode();
        return result;
    }
}

然后,您只需使用contains()运算符搜索该列表。检查以下修改后的代码段:

代码语言:javascript
复制
public void loadGamesByDateAndName(String date, String name) {
    Timber.d("Load games by date: " + date + " and name: " + name);
    remoteDataHelper 
            .getGamesListByDate(date) 
            .flatMapObservable(Observable::fromIterable) 
            .filter(game -> game.platforms() != null) 
            .filter(game -> game.platforms().contains(new GamePlatformInfo(name))) // This is all you need to do to search through the list.
            .toList() 
            .subscribe(getObserverFiltered(name, false));
} 

下面是:如果您创建一个覆盖equals()方法的类的列表,那么list.contains()方法使用给定的等号定义来比较列表中的项。

希望能帮上忙。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46080226

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档