如何结合 Mono 和 Flux 来创建一个对象?

How to combine a Mono and a Flux to create one object?

我想创建一个对象,对象由一个Mono和一个Flux组成。 假设有 2 个服务 getPersonalInfogetFriendsInfoPerson 需要这两种服务来创建对象。压缩只采用 friends 对象的第一个元素,因为只有一个 personalInfo 因为它是 Mono,但 friendsInfo 可能有多个 friend 对象。我想在 Person.

中将 friendsInfo 设置为 friend
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));

根据你的问题,我假设你想创建一个 单人 对象,其中包含从你的 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));

...这应该可以满足您的需求。