【问题标题】:How to return boolean value when subscribe with rxjava使用 rxjava 订阅时如何返回布尔值
【发布时间】:2019-07-21 17:30:16
【问题描述】:

我有一个数组列表。如果我的数组中至少有一项是数字,我需要返回 true。 这是我的代码:

    private boolean hasNumber(ArrayList<Item> items) {
          return Observable.fromIterable(items)
               .filter(Item::isNumber)                
                .toList()
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .map(items-> items.size() > 0)
                .subscribe(result -> "");
   }

但是我不能从这个方法返回真/假。我不明白如何用 rxJava 返回值。请帮帮我。

【问题讨论】:

  • @GhostCat 他正在努力学习。没有错。
  • @PrashantPandey 我不同意。您通过寻找有意义的应用程序来学习概念。做一些没有意义的事情,可以用 3 行老式的 for-each 循环来完成,或者一个简单的单行 stream() 表达式不太有用。另请注意,这个社区专注于高质量的内容,因此即使是问题也应该清楚并以某种方式理由,以便未来的读者能够理解他们的意思。这个问题询问如何用机枪打开罐子。你没有,你用开罐器。
  • @GhostCat,这只是举例。事实上,我有一个非常大的数据列表。我需要为每个元素计算一个复杂的公式,如果在计算公式后至少有一个元素变为零,则返回 true。我需要不要在 UI 线程中进行此计算
  • @GhostCat,公式的计算需要几秒钟。当我循环执行此操作时,应用程序会冻结。
  • @GhostCat,这是一个android应用程序,我不需要swing。我只需要不在 UI 线程中执行操作,因为它会阻塞它

标签: java android rx-java


【解决方案1】:

一个 hacky 方法是:

  private boolean hasNumber(List<Item> items) {
    Boolean[] res = new Boolean[1];
    res[0] = false;
    Observable.from(items).filter(this::isNumber).toList().subscribe(list -> {
        if(list.size() > 0) {
          res[0] = true;
        }
    });
    return res[0];
  }

【讨论】:

  • 这可能有效(我将使用布尔数组,而不是布尔数组),但我仍然不明白为什么这样做会有任何意义。当所有数据都已经在该列表中时,使用 Observable 的目的是什么?您的回答可能会回答问题,但不会增加“缺失的意义”,恕我直言。
  • 是的,没有任何意义,你是对的。但他可能正在努力学习。这个例子将教他: 1. 为什么在 Lambda 中只能使用 final 或有效的 final 变量。 2. 在这个例子中我们是如何克服这个问题的。
  • 并非如此。如果他想了解 lambdas 和局部变量,我宁愿在这里提出现有问题,例如,stackoverflow.com/a/38402625/1531124 是对该主题的一个很好的介绍;-) 没关系,您的答案至少可以编译;- ) x2
  • @GhostCat 完全。只是刚开始接触这个东西的时候,我曾经问过很多这样的问题哈哈,所以我完全可以和OP联系起来。但你的观点绝对站得住脚。
【解决方案2】:

试试blockingFirst

private boolean hasNumber(ArrayList<Item> items) {
    return Observable.fromIterable(items)
        .filter(Item::isNumber)                
        .toList()
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .map(items-> items.size() > 0)
        .blockingFirst();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-03
    • 1970-01-01
    • 2019-03-06
    • 2018-01-12
    相关资源
    最近更新 更多