【问题标题】:RxJava - groupBy, toMap and flatMap not working well together?RxJava - groupBy、toMap 和 flatMap 不能很好地协同工作?
【发布时间】:2018-12-25 11:05:30
【问题描述】:

我希望这个小例子能打印出所有能被 3 整除的数字。

@Test
public void test() {
    Observable.range(1, 100)
            .groupBy(n -> n % 3)
            .toMap(g -> g.getKey())
            .flatMap(m ->  m.get(0))
            .subscribe(System.out::println);
}

println 没有打印任何东西,我不明白为什么。

我从一个更复杂的例子中简化了这个例子,我知道这可以用不同的方式完成,但我需要这种方式,因为涉及更多的组,需要同时在 flatMap 中进行操作.

感谢您的帮助!

【问题讨论】:

  • 为什么不只是filter(n -> n % 3 == 0)
  • 你期望什么输出?
  • 在 RxJava 1 和 2 中都适用于我(你需要 flatMapObservable 那里)。你运行的是什么版本?
  • 不幸的是,这是一个旧版本,我被限制了,这可能是我猜想的问题。我面前没有项目,但我记得它是 0.14.something。你认为我应该对这个版本做一些不同的事情吗?
  • 0.14 是古老的(或 1.0.14?),多年来groupByflatMap 都有几个错误。

标签: java functional-programming rx-java reactive-programming rx-java2


【解决方案1】:

正如@akarnokd 在上面的评论中所说,该示例适用于最新版本的 RxJava v1 和 v2,但不适用于我们正在使用的版本 (com.netflix.rxjava:rxjava-core:jar:0.16 .1,这是古老的)可能是由于库本身的错误。

【讨论】:

    【解决方案2】:

    groupBy 运算符将输入源项映射到 HashMap,其中最新值存储在键下。

    引用文档:

    If more than one source item maps to the same key, the HashMap will contain the latest of those items.

    因此,在您的情况下,toMap 运算符将输入序列转换为以下HashMap {0=99, 1=100, 2=98}

    要过滤掉指定范围内不能被 3 整除的所有数字,只需按照 @Nikolas 的建议使用 filter 运算符。

    【讨论】:

      【解决方案3】:

      使用方法filter(Predicate<? super T> predicate)而不是groupBy(..)来发出满足指定谓词的元素。

      Observable.range(1, 100)
          .filter(n -> n % 3 == 0)
          .toMap(g -> g.getKey())
          .flatMap(m ->  m.get(0))
          .subscribe(System.out::println);
      

      Java Stream-API 的工作原理相同:

      IntStream.range(1, 100).filter(n -> n%3 == 0).forEach(System.out::println);
      // prints 3, 6, 9, 12... on the each line
      

      【讨论】:

      • 对不起,我不清楚这个问题。我已要求您提供预期的输出以明确问题。
      • 它写在问题的第一行,它应该打印所有能被 3 整除的数字。@akarnokd 在上面的 cmets 中处于正确的轨道上。
      猜你喜欢
      • 2016-12-08
      • 2020-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-14
      • 2018-01-18
      • 1970-01-01
      • 2012-01-07
      相关资源
      最近更新 更多