Как объединить Mono и Flux для создания одного объекта?

Я хочу создать один объект, состоящий из Mono и Flux. Допустим, есть 2 сервиса getPersonalInfo и getFriendsInfo. Person необходимы обе службы для создания объекта. При сжатии используется только первый элемент объекта friends, поскольку есть только один personalInfo, поскольку это Mono, но в friendsInfo может быть несколько friend объектов. Я хочу установить friendsInfo на friend в Person.

class Person{
    String name;
    String age;
    List<Friend> friend;
}

Mono<PersonalInfo> personalInfo = personService.getPerson();// has name and age
Flux<Friend> friendsInfo = friendsService.getFriends();
// here I want to create Person object with personalInfo and friendsInfo
Flux<Person> person = Flux.zip(personalInfo, friendsInfo, (person, friend) -> new Person(person, friend));

person koukou    schedule 11.05.2021    source источник
comment
Итак, вы хотите собрать друзей из Flux в список?   -  person Raedwald    schedule 11.05.2021


Ответы (1)


Исходя из вашего вопроса, я предполагаю, что вы хотите создать объект single, который содержит имя и возраст, указанные в вашем Mono<PersonalInfo>, и список друзей из вашего Flux<Person>.

Ваша попытка довольно близка:

Flux<Person> person = Flux.zip(Person, Friend, (person, friend) -> new Person(person, friend));

В частности, оператор zip с перегрузкой, которая требует двух издателей и комбинатора, - это как раз то, что нужно здесь использовать. Однако нужно изменить пару вещей:

  • Вам нужен одиночный Person объект, поэтому это должен быть Mono<Person> (и связанный Mono.zip().
  • Согласно комментарию, вам нужно преобразовать ваш Flux в список, что вы можете сделать с помощью collectList() oeprator.

Итак, сложив это вместе, вы получите что-то вроде:

Mono<Person> person = Flux.zip(personalInfo, friendsInfo.collectList(), (personalInfo, friendsList) -> new Person(personalInfo, friendsList));

... что должно дать вам то, что вам нужно.

person Michael Berry    schedule 11.05.2021
comment
БОЛЬШОЕ СПАСИБО! это работает, и я искал друзейInfo.collectList (). Опять же, очень признателен за вашу помощь! - person koukou; 12.05.2021