我想创建一个对象,该对象由一个 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));
从你的问题来看,我假设你想创建一个single人对象,其中包含从你的
Mono<PersonalInfo>
填充的姓名和年龄,以及从你的Flux<Person>
中填充的朋友列表。
您的尝试非常接近:
Flux<Person> person = Flux.zip(Person, Friend, (person, friend) -> new Person(person, friend));
特别是,具有需要两个发布者和一个组合器的重载的
zip
运算符正是在这里使用的正确选择。然而,有几件事需要改变:
Person
对象,因此应该是一个 Mono<Person>
(以及关联的 Mono.zip()
。collectList()
操作器来完成此操作。所以把它们放在一起,你最终会得到这样的结果:
Mono<Person> person = Flux.zip(personalInfo, friendsInfo.collectList(), (personalInfo, friendsList) -> new Person(personalInfo, friendsList));
...这应该会给你你想要的东西。
您也可以使用 Mono.zip
执行相同操作Mono<Person> person = Mono.zip(personalInfo, friendsInfo.collectList())
.map(zippedMono -> new Person(zippedMono.getT1(), zipeedMono.getT2());
为了代码的可读性,我更喜欢使用 Mono。