从两个 Mono 对象中获取属性并使用 Reactor Java 将它们设置为第三个对象的属性

Posted

技术标签:

【中文标题】从两个 Mono 对象中获取属性并使用 Reactor Java 将它们设置为第三个对象的属性【英文标题】:Grab Attributes from two Mono Objects and set them as a property to a third object using Reactor Java 【发布时间】:2022-01-24 05:07:30 【问题描述】:

我有两个 Api,它们返回两个不同的 Mono 对象

Mono<User> user1 = api.service1(...);
Mono<UserV2> user2 = api.service2(...);

我想从这些对象中获取一个属性,然后将它们设置为另一个对象,比如 SuperUser

SuperUser superUser = new SuperUser();

我想做这样的事情

superUser.setProp1(user1.getProp1());
superUser.setProp2(user2.getProp1());

完成后,我想向超级用户对象发送一些方法。

【问题讨论】:

user1.map(usr -> usr.getProp1()).subscribe(System.out::println);我已经尝试过这样的事情,但是如何将其设置为对象? 【参考方案1】:

压缩两个单声道并从元组创建超级用户

Mono.zip(user1, user2).flatMap(data->
    // get those values as below
    data.getT1();
    data.getT2();

    // set it to superUser
    return <your_response_object>;
);

【讨论】:

谢谢你——我花了几个小时在这上面:'(【参考方案2】:

这是一种更清洁的方法:)

SuperUser superUser = new SuperUser();

return Mono.zip(user1, user2).flatMap(data -> 
            String prop1 = data.getT1().getProp1();
            String prop2 = data.getT2().getProp1();
            if(prop1 != null)) 
                    superUser.setProp1(prop1);
            
            if(prop2 != null) 
                superUser.setProp2(prop2);
            
            return superUser;
        );

【讨论】:

【参考方案3】:

像这样使用Mono#zipWith:

Mono<SuperUser> superUserMono = user1.zipWith(user2)
    .map(userTuple -> 
       superUser.setProp1(userTuple.getT1().getProp1());
       superUser.setProp2(userTuple.getT2().getProp1());
       
       return superUser;
    )

【讨论】:

以上是关于从两个 Mono 对象中获取属性并使用 Reactor Java 将它们设置为第三个对象的属性的主要内容,如果未能解决你的问题,请参考以下文章

useEffect 尝试在 React 中更新状态之前读取对象的属性

如何在 Spring Boot 中修改 Mono 对象的属性而不阻塞它

如何从 Mono<ClientResponse> 获取正文?

从嵌套属性数组中获取对象嵌套值

从存储在 React 状态中的对象数组访问属性

如何从Mono获取实体类型 ?