我对Rx编程非常陌生,我在一个项目中尝试了一下。我想要的是拥有一个GamesInfoList对象,如下所示:
@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();
}
}现在,我想按日期和名称加载我的游戏,并为此编写了一个方法来访问上面的对象。
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应用程序中的名称和显示?要按日期和名称加载数据,需要对上述方法进行哪些更改?
发布于 2017-09-06 18:45:24
最简单的方法是在第二个filter操作符中迭代。
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));
}发布于 2017-09-07 05:16:07
您需要在equals()类中重写GamePlatformInfo方法。
我假设您对GamePlatformInfo类有以下类定义:
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()运算符搜索该列表。检查以下修改后的代码段:
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()方法使用给定的等号定义来比较列表中的项。
希望能帮上忙。
https://stackoverflow.com/questions/46080226
复制相似问题