2015-06-14 13 views
7

Mam następujący przypadek użycia (jest to oczywiście wymyślny przykład, ale gdy już znam odpowiedź, będę mógł przenieść ją na prawdziwy problem, który mam rozwiązać):Zbieraj zgrupowane emisje z obserwowanych obiektów do jednej listy.

  1. Uzyskaj listę liczb całkowitych.
  2. je pogrupować w wyniku operacji% 4
  3. Zebrać elementy każdej grupy list
  4. ignorowanie żadnych grup/wymienia, które mają mniej elementów niż 3 elementów
  5. emitowania jednej liście, których elementy są listy utworzone w kroku # 3

Tu jest mój bieżący kod:

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

a jego wyjście jest:

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

Tak więc wypisuje liczbę elementów każdej grupy, a następnie listę elementów. Chciałbym, żeby dane wyjściowe (w rzeczywistości nie obchodziły mnie klucze):

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

czyli w jakiś sposób spłaszczono zgrupowane obserwacje w jedną listę. Nie mogę tego zrobić. Na przykład dodanie .flatMap(integers -> Observable.just(integers)) po filter niczego nie zmienia, ponieważ wpływa tylko na każdy obserwowany zgrupowany, a nie cały strumień. Czy istnieje sposób spełnienia moich wymagań?

+1

Nie jestem pewien, czy mam rozumieć cię poprawnie, ale tutaj jest istota, która produkuje wyjście, które chciałeś - https://gist.github.com/nsk-mironov/e13fe46938bf887f174a –

+0

To jest dokładnie to, co chciałem dostać. Podczas pisania odpowiedzi z kodem, aby ją zaakceptować, postaram się to zrozumieć; d – wujek

Odpowiedz

16

Nie jestem pewien, czy mam cię rozumieć poprawnie, ale w oparciu o pożądanym wyjściem Oto kod może być szukasz:

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

Zakładałem swoją mapę w niewłaściwym miejscu. Dziękuję Ci. W tym jesteś całkiem dobry; – wujek

Powiązane problemy