我正在尝试调用列表中的每个项目,为列表中的每个项目添加一些额外的数据。我正在使用改造+ RxJava。
我需要获取用户列表,为每个用户拨打电话,并通过他的adreess邮政编码获取城市。
我是如何尝试的。
public void getUsers() {
Observable<List<User>> userObservable = mService.getUsers()
.flatMapIterable(new Func1<List<User>, Iterable<User>>() {
@Override
public Iterable<User> call(List<User> user) {
return users;
}
})
.flatMap(new Func1<User, Observable<City>>() {
@Override
public Observable<City> call(User user) {
return mService.getCity(user.getAdress.getPostal_code);
}
})
.map(new Func1<User, City>() {
@Override
public City call(User user) {
return user.getAdress().getCity().getName();
}
})
服务:
@GET("/somelink/users")
Observable<List<User>> getUsers();
@GET("/somelink/users/{code}")
Observable<City> getCity(@Path("code") String postalCode);
public class User {
@SerializedName("id")
@Expose
private Integer id;
@SerializedName("name")
@Expose
private String name;
@SerializedName("adress")
@Expose
private Adress adress;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.named = name;
}
public Adress getAdress() {
return adress;
}
public void setAdress(Adress adress) {
this.adress = adress;
}
}
public class Adress {
privare City;
@SerializedName("postal_code")
@Expose
private String postal_code;
@SerializedName("street")
@Expose
private String street;
public String getPostal_code() {
return postal_code;
}
public void setPostal_code(String postal_code) {
this.postal_code = postal_code;
}
public Adress getStreet() {
return adress;
}
public void setStreet(String street) {
this.street = street;
}
public City getCity() {
return city;
}
public void setCity(City city) {
this.city = city;
}
}
public class City {
@SerializedName("name")
@Expose
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
getUsers()返回
[
{
"id": 1
"name": "John Doe",
"adress": {
"postal_code": "somecode",
"street": "some Street ..."
}
},
{
"id": 2
"name": "Adam Smith",
"adress": {
"postal_code": "somecode",
"street": "some other Street ..."
}
]
在map函数中我得到了错误&#34;没有类型变量的实例存在,因此City符合User&#34;。我认为错误在模型中,但不知道如何使它们正确。我是Rxjava的新手,在这里遇到问题。
答案 0 :(得分:1)
此操作正在返回尝试将User
转移到Observable<City>
。
.flatMap(new Func1<User, Observable<City>>() {
@Override
public Observable<City> call(User user) {
return mService.getCity(user.getAdress.getPostal_code());
}
})
然后,在这里,您从上一个操作返回了Observable<City>
,但是您为此地图添加了User
,并尝试转换为City
。
你告诉RxJava你想要归还一些City
,而不是String
.map(new Func1<User, City>() {
@Override
public City call(User user) {
return user.getAdress().getCity().getName();
}
})
user.getAdress().getCity().getName();
会返回String
。
public class City {
@SerializedName("name")
@Expose
private String name;
public String getName() {
return name;
}
所以,我认为你的意思是.map(new Func1<City, String>() {
,虽然我也认为你应该订阅Observable<City>
而不是映射它。然后,如果您遵循RxJava的订阅模型,那么您可能只是return mService.getUsers().flatMapIterable(...
来自该方法并且不进行最终的地图操作。