如何使用 RxJava 将嵌套的 double 值列表转换为 Java class?
How to transform a nested list of double values into a Java class using RxJava?
在我的 Android 客户端中,我从后端收到此 JSON 数据:
[
[
1427378400000,
553
],
[
1427382000000,
553
]
]
这是实际加载数据的例程。我在这里使用RxAndroid and Retrofit。
private void getProductLevels() {
Observable<List<List<Double>>> responseObservable =
mProductService.readProductLevels();
AppObservable.bindFragment(this, responseObservable)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
// TODO: Transform List<List<Double>> into List<ProductLevel>
.subscribe(new Subscriber<List<List<Double>>>() {
@Override
public void onCompleted() {}
@Override
public void onError(Throwable e) {}
@Override
public void onNext(List<List<Double>> response) {}
});
}
如何使用 RxJava 运算符将内部 List<Double>
映射到特定的 Java class,例如 ProductLevel
=28=]?
public class ProductLevel {
public Double mTimeStamp;
public Double mLevel;
public ProductLevel(Double timeStamp, Double level) {
mTimeStamp = timeStamp;
mLevel = level;
}
}
最后,我想收到这个:List<ProductLevel>
。
List<ProductLevel> productLevels = new ArrayList<>();
for(List<Double> p: list) {
productLevels.add(new ProductLevel(p.get(0),p.get(1)));
}
我觉得应该可以。
如果您将 readProductLevels
更改为一次发出每个列表项,您可以
然后一次对他们做出反应:
在 mProductService 中:
private Observable<List<Double>> readProductLevels() {
return Observable.create(
new Observable.OnSubscribe<List<Double>>() {
@Override
public void call(Subscriber<? super List<Double>> subscriber) {
List<List<Double>> items = new ArrayList<List<Double>>();
List<Double> list1 = new ArrayList<Double>() {{
add(1D);
add(2D);
}};
items.add(list1);
List<Double> list2 = new ArrayList<Double>() {{
add(10D);
add(12D);
}};
items.add(list2);
List<Double> list3 = new ArrayList<Double>() {{
add(21D);
add(22D);
}};
items.add(list3);
// Imagine the list creation above is your Json parsing
for (List<Double> list : items) {
subscriber.onNext(list);
}
subscriber.onCompleted();
}
});
}
允许您订阅超级列表中的每个项目:
private void getProductLevels() {
Observable<List<Double>> responseObservable = readProductLevels();
AppObservable.bindFragment(this, responseObservable)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
// TODO: Transform List<List<Double>> into List<ProductLevel>
.subscribe(
new Subscriber<List<Double>>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(List<Double> response) {
new ProductLevel(response.get(0), response.get(1));
}
});
}
根据您的数据,您会收到一个配对列表(时间戳、级别)。这对由仅包含 2 个值的列表表示。
所以你想发出每一对,然后将每对转换成ProductLevel
。
为此,您必须 flatMap
您的配对列表才能发出每一对。然后把map
每对变成一个ProductLevel
。最后,只需构建一个包含所有已发出项目的 list
。
(java8 样式)
AppObservable.bindFragment(this, responseObservable)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.flatMapIterable(listOfList -> listOfList) // or flatMap(l -> Observable.from(l))
.map(pair -> new ProductLevel(pair.get(0),pair.get(1))) // build ProductLevel for each pair
.toList() // build a list with all ProductLevel
.subscribe(listOfProductLevel -> /** ... **/);
在我的 Android 客户端中,我从后端收到此 JSON 数据:
[
[
1427378400000,
553
],
[
1427382000000,
553
]
]
这是实际加载数据的例程。我在这里使用RxAndroid and Retrofit。
private void getProductLevels() {
Observable<List<List<Double>>> responseObservable =
mProductService.readProductLevels();
AppObservable.bindFragment(this, responseObservable)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
// TODO: Transform List<List<Double>> into List<ProductLevel>
.subscribe(new Subscriber<List<List<Double>>>() {
@Override
public void onCompleted() {}
@Override
public void onError(Throwable e) {}
@Override
public void onNext(List<List<Double>> response) {}
});
}
如何使用 RxJava 运算符将内部 List<Double>
映射到特定的 Java class,例如 ProductLevel
=28=]?
public class ProductLevel {
public Double mTimeStamp;
public Double mLevel;
public ProductLevel(Double timeStamp, Double level) {
mTimeStamp = timeStamp;
mLevel = level;
}
}
最后,我想收到这个:List<ProductLevel>
。
List<ProductLevel> productLevels = new ArrayList<>();
for(List<Double> p: list) {
productLevels.add(new ProductLevel(p.get(0),p.get(1)));
}
我觉得应该可以。
如果您将 readProductLevels
更改为一次发出每个列表项,您可以
然后一次对他们做出反应:
在 mProductService 中:
private Observable<List<Double>> readProductLevels() {
return Observable.create(
new Observable.OnSubscribe<List<Double>>() {
@Override
public void call(Subscriber<? super List<Double>> subscriber) {
List<List<Double>> items = new ArrayList<List<Double>>();
List<Double> list1 = new ArrayList<Double>() {{
add(1D);
add(2D);
}};
items.add(list1);
List<Double> list2 = new ArrayList<Double>() {{
add(10D);
add(12D);
}};
items.add(list2);
List<Double> list3 = new ArrayList<Double>() {{
add(21D);
add(22D);
}};
items.add(list3);
// Imagine the list creation above is your Json parsing
for (List<Double> list : items) {
subscriber.onNext(list);
}
subscriber.onCompleted();
}
});
}
允许您订阅超级列表中的每个项目:
private void getProductLevels() {
Observable<List<Double>> responseObservable = readProductLevels();
AppObservable.bindFragment(this, responseObservable)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
// TODO: Transform List<List<Double>> into List<ProductLevel>
.subscribe(
new Subscriber<List<Double>>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(List<Double> response) {
new ProductLevel(response.get(0), response.get(1));
}
});
}
根据您的数据,您会收到一个配对列表(时间戳、级别)。这对由仅包含 2 个值的列表表示。
所以你想发出每一对,然后将每对转换成ProductLevel
。
为此,您必须 flatMap
您的配对列表才能发出每一对。然后把map
每对变成一个ProductLevel
。最后,只需构建一个包含所有已发出项目的 list
。
(java8 样式)
AppObservable.bindFragment(this, responseObservable)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.flatMapIterable(listOfList -> listOfList) // or flatMap(l -> Observable.from(l))
.map(pair -> new ProductLevel(pair.get(0),pair.get(1))) // build ProductLevel for each pair
.toList() // build a list with all ProductLevel
.subscribe(listOfProductLevel -> /** ... **/);