收集分组的可观察量'排放到一个列表中

时间:2015-06-14 15:16:46

标签: rx-java

我有以下用例(这当然是一个人为的例子,但是一旦我知道答案,我就能将它移植到我要解决的真正问题中):

  1. 获取整数列表。
  2. 按%4操作的结果对它们进行分组
  3. 将每个组的元素收集到列表
  4. 忽略元素少于3个元素的任何组/列表
  5. 发出一个列表,其元素是在步骤#3中创建的列表
  6. 这是我目前的代码:

        Observable
                .from(Arrays.asList(0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 12))
                .groupBy(item -> item % 4)
                .subscribe(groupedObservable -> {
                    groupedObservable
                            .toList()
                            .filter(list -> list.size() > 2)
                            .subscribe(result -> {
                                System.out.printf("%d results %s%n", result.size(), result);
                            });
                });
    

    ,其输出为:

    4 results [0, 4, 8, 12]
    3 results [2, 6, 10]
    3 results [3, 7, 11]
    

    因此,它打印出每个组有多少元素,然后打印元素列表。我希望输出(我实际上不关心键):

    3结果:[[0,4,8,12],[2,6,10],[3,7,11]]

    即。以某种方式将分组的可观察量展平为一个列表。我没有这样做。例如,在.flatMap(integers -> Observable.just(integers))之后添加filter并不会更改任何内容,因为它只会影响每个分组的可观察对象,而不会影响整个流。有没有办法满足我的要求?

1 个答案:

答案 0 :(得分:19)

我不确定我是否理解正确,但根据所需的输出,您可能正在寻找代码:

public static void main(final String[] args) throws Exception {
    Observable.from(Arrays.asList(0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 12))
            .groupBy(item -> item % 4)
            .flatMap(Observable::toList)
            .filter(integers -> integers.size() > 2)
            .toList()
            .subscribe(result -> {
                System.out.printf("%d results %s%n", result.size(), result);
            });
}