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

问题描述 投票:0回答:2

我想创建一个对象,该对象由一个 Mono 和一个 Flux 组成。 假设有 2 个服务

getPersonalInfo
getFriendsInfo
Person
需要这两个服务来创建对象。压缩仅采用
friends
对象的第一个元素,因为它是 Mono,因此只有一个
personalInfo
,但
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));
java spring-webflux project-reactor reactor reactive-streams
2个回答
1
投票

从你的问题来看,我假设你想创建一个single人对象,其中包含从你的

Mono<PersonalInfo>
填充的姓名和年龄,以及从你的
Flux<Person>
中填充的朋友列表。

您的尝试非常接近:

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

特别是,具有需要两个发布者和一个组合器的重载的

zip
运算符正是在这里使用的正确选择。然而,有几件事需要改变:

  • 您想要一个 single
    Person
    对象,因此应该是一个
    Mono<Person>
    (以及关联的
    Mono.zip()
  • 根据评论,您需要将 Flux 转换为列表,您可以使用
    collectList()
    操作器来完成此操作。

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

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

...这应该会给你你想要的东西。


0
投票

您也可以使用 Mono.zip

执行相同操作
Mono<Person> person = Mono.zip(personalInfo, friendsInfo.collectList())
.map(zippedMono -> new Person(zippedMono.getT1(), zipeedMono.getT2());

为了代码的可读性,我更喜欢使用 Mono。

© www.soinside.com 2019 - 2024. All rights reserved.