【问题标题】:How to combine a Mono and a Flux to create one object?如何结合 Mono 和 Flux 创建一个对象?
【发布时间】:2021-08-02 00:02:57
【问题描述】:

我想创建一个对象,该对象由 Mono 和 Flux 组成。 假设有 2 个服务 getPersonalInfo 和 getFriendsInfo。 Person 需要两个服务来创建对象。压缩只需要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));

【问题讨论】:

  • 那么,您想将 Flux 中的朋友收集到一个列表中吗?

标签: java spring-webflux project-reactor reactor reactive-streams


【解决方案1】:

根据您的问题,我假设您想创建一个 single 个人对象,其中包含从您的Mono&lt;PersonalInfo&gt; 填充的姓名和年龄,以及从您的Flux&lt;Person&gt; 填充的朋友列表。

您的尝试非常接近:

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

特别是,zip 运算符具有需要两个发布者和一个组合器的重载,在这里使用是完全正确的。但是,有几件事需要改变:

  • 你想要一个单个 Person 对象,所以它应该是一个Mono&lt;Person&gt;(以及关联的Mono.zip()。
  • 根据评论,您需要将 Flux 转换为列表,您可以使用 collectList() 操作符来实现。

所以把它们放在一起,你最终会得到这样的结果:

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

...这应该会给你你所追求的。

【讨论】:

  • 非常感谢!它有效,我正在寻找friendsInfo.collectList()。再次感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 2020-01-02
  • 2019-01-07
  • 1970-01-01
  • 1970-01-01
  • 2020-05-04
  • 2021-09-30
  • 2021-07-31
  • 2018-12-07
相关资源
最近更新 更多