2015-06-14 3 views
7

У меня есть следующий прецедент (это, конечно, надуманный пример, но как только я знаю ответ, я смогу перенести его в реальную проблему, которую я должен решить):Собирать выбросы сгруппированных наблюдаемых в один список

  1. Получить список целых чисел.
  2. Группа их в результате операции% 4
  3. собрать элементы каждой группы в списках
  4. игнорировать любые группы/списки, которые имеют меньше элементов, чем 3-х элементов
  5. испускают один список, чьи элементы являются списки, созданные в шаге № 3

Вот мой текущий код:

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

Я не уверен, если я вас понял правильно, но вот суть, которая выдает желаемый результат - https://gist.github.com/nsk-mironov/e13fe46938bf887f174a –

+0

Это именно то, что я хотел получить. Пока вы пишете ответ с кодом, чтобы я мог его принять, я постараюсь это понять; d – wujek

ответ

16

Я не уверен, если я правильно вас понял, но на основе желаемых результатов здесь является код, который вы могли бы искать:

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); 
      }); 
} 
+0

Я помещал свою плоскую карту в неположенное место. Спасибо. Вы очень хороши в этом; d – wujek

Смежные вопросы