【问题标题】:How to parse RxJava to receive just the data that i want?如何解析 RxJava 以接收我想要的数据?
【发布时间】:2017-04-06 12:36:54
【问题描述】:

我只想要数字,但这是我在日志中收到的:

[牛肝菌(等级=4.5),牛肝菌(等级=9.5)]

回应:

public class GradeResponse {

    @Inject
    Retrofit retrofit;

    @Inject
    MainPresenter mainPresenter;

    public void getGradeRx() {

        MyApplication.getMainComponent().injectIntoGradeResponse(this);// informando ao dagger sobre o uso de um component e a necessidade de injetar dependência

        Subscription getGrade = retrofit
                .create(GradeService.class)
                .getGrade()
                .subscribeOn(Schedulers.newThread())
                .observeOn(AndroidSchedulers.mainThread())
                .map(model -> {

                    return model.getBoletim();

                })
                .subscribe(new Observer<Boletim[]>() {
                    @Override
                    public void onCompleted() {

                    }

                    @Override
                    public void onError(Throwable e) {
                        Log.i(TAG, "saporra vai me matar ainda");
                    }

                    @Override
                    public void onNext(Boletim[] grades) {
                        Log.i(TAG, Arrays.asList(grades).toString());
                    }
                });
    }
}

模型:

GradeModel:

@SerializedName("boletim")
    @Expose
    private Boletim[] boletim;

Boletim.class

public class Boletim {

    @SerializedName("grade")
    @Expose
    private double grade;

改造服务正常,依赖注入工作。我从 rxJava 接收 onSuccess 方法,我现在只需要接收没有这个 "[Boletim(grade=".

的数字

【问题讨论】:

  • 在此处查看过滤器运算符 - github.com/ReactiveX/RxJava/wiki/Filtering-Observables
  • 你不应该使用Arrays.asList(grades).toString()
  • @LyubomyrShaydariv 那我应该用什么?
  • @StuStirling 你能用它做一个演示吗?
  • @StuStirling 为什么你认为这是一个过滤器?这是一个转变

标签: java android rx-java rx-android


【解决方案1】:

您看到对象的 toString 是因为您在地图中获得了整个对象!

只有没有这个“[Boletim(grade=".

您不能再次映射并提取它吗?

.map(model -> {               // This map returns a Boletim[]
     return model.getBoletim();
 })
.map(boletim -> {             // This map returns a double[]
    Double grades = new Double[boletim.length];
    for (int i =0; i < grades.length ; i++) {
        grades[i] = boletim[i].getGrade() ;
    } 
    return grades;
}).subscribe(new Observer<Double[]>() {   // This subscribes to a double[]
    @Override
    public void onCompleted() {

    }

    @Override
    public void onError(Throwable e) {
        Log.i(TAG, "saporra vai me matar ainda");
    }

    @Override
    public void onNext(Double[] grades) {
        Log.i(TAG, Arrays.toString(grades));
    }
}

或者你可以将 for 循环放入 onNext

如果你不想要一个 Observable 数组,那么使用 flatMap

【讨论】:

  • 没用。因为在说“无法解决方法订阅”。
  • 而且即使放在 onNext 里面也不行,因为它需要一个 Boletim 类型,而那个循环是针对 double 类型的。
  • 1) 订阅 is 一种方法,我没有完成它,因为你的问题中已经有了它 2) "因为它需要 Boletim 类型 i>" -- 不,这不是真的。我已将您的 Boletim 对象映射到双数组中。您需要将代码从 new Observer&lt;Boletim[]&gt; 更改为 new Observer&lt;Double[]&gt;,正如我所展示的那样
  • 我这样做了,又给了我一个错误。不接受类型
  • 不,它是 new Observer 但地图里面是 Double[] Grades = new Double[boletim.length];我确定了你的答案并给了你分数。感谢您的帮助,现在是这样 [4.5, 9.5]。
猜你喜欢
  • 2012-06-30
  • 2011-08-06
  • 1970-01-01
  • 1970-01-01
  • 2017-02-19
  • 1970-01-01
  • 2019-09-10
  • 2019-07-25
  • 1970-01-01
相关资源
最近更新 更多