WebFlux i grupowanie elementów w listy

0

Załóżmy, że mam taki strumień:
Flux.just(1,2,3,4,5,6,7,8,9);

i teraz chciałbym zwrócić taki response przez kontroler:

{
  "list_one": [
   1,4,7
  ],
  "list_two": [
    2,5,8
  ],
  "list_three": [
   3,6,9
  ]
}

Czyli brać po jednym elemencie strumienia i wsadzać po kolei do odpowiedniej listy. Pierwszy do pierwszej listy, drugi do drugiej, trzeci do trzeciej, czwarty znowu do pierwszej i tak dalej. Pytanie brzmi jak to osiągnąć operatorami z Reactora? Flux intów podany tylko dla przykłady w rzeczywistości mam Flux realnej klasy z polami typu data, content itd. Proszę o pomoc.

0

Może podzielić na 3 fluxy jakimś filtrem, zmapowac i połączyć z powrotem. Ale nie wiem czy masz możliwość na czymś ten filtr zbudować, bo nie znamy tych Twoich docelowych obiektów. Można tez pogrupować jakby było wg czego

Edit: jak widać niżej, jest wg czego :)

3

Możesz coś takiego. Możliwe, że da się jakoś lepiej potem to zredukować. Wynik Output(first=[A, D, G, J], second=[B, E, H, K], third=[C, F, I]). No i to wywali się, jeśli będzie mniej niż 3 elementy w oryginalnym strumieniu, ale z tym możesz sam powalczyć.

public final class App {
  public static void main(String[] args) {
    Flux.just("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K")
        .index()
        .groupBy(it -> it.getT1() % 3, Tuple2::getT2)
        .flatMap(Flux::collectList)
        .collectList()
        .map(it -> new Output(it.get(0), it.get(1), it.get(2)))
        .subscribe(System.out::println);
  }
}

final class Output {
  final List<String> listOne;
  final List<String> listTwo;
  final List<String> listThree;

  Output(List<String> listOne, List<String> listTwo, List<String> listThree) {
    this.listOne = listOne;
    this.listTwo = listTwo;
    this.listThree = listThree;
  }

  @Override public String toString() {
    return String.format("Output(first=%s, second=%s, third=%s)", listOne, listTwo, listThree);
  }
}
0

Super, działa tak jak powinno. Ja tak samo nie zdawałem sobie sprawy o istnieniu funkcji index(), a właśnie czegoś na jej wzór potrzebowałem. Dzięki za pomoc.

1 użytkowników online, w tym zalogowanych: 0, gości: 1