使用混合反应式代码,即Mono和amp;Flux对象是反应流以及Java8流
我有两个对象,每个对象都包含一个列表,我的整个spring引导项目都使用ProjectReactor构造。我应该在flux或mono map操作中使用java流来遍历和操作数据吗使用混合反应式代码,即Mono和amp;Flux对象是反应流以及Java8流,java,spring-boot,reactive-programming,project-reactor,Java,Spring Boot,Reactive Programming,Project Reactor,我有两个对象,每个对象都包含一个列表,我的整个spring引导项目都使用ProjectReactor构造。我应该在flux或mono map操作中使用java流来遍历和操作数据吗 Flux.fromIterable(page.getPageFieldData()).subscribeOn(Schedulers.elastic()).map(pageField - > { clientDataMono.subscribeOn(Schedulers.elastic()).map
Flux.fromIterable(page.getPageFieldData()).subscribeOn(Schedulers.elastic()).map(pageField - > {
clientDataMono.subscribeOn(Schedulers.elastic()).map(clientData - > {
Flux.fromIterable(clientData.getPageFieldData())
.filter(clientPageField - > clientPageField.getId() == pageField.getId())
.subscribeOn(Schedulers.elastic()).map(field - > {
dataUpdated = true;
pageField.setData(field.getData());
return field;
}).subscribe();
return clientData;
}).subscribe();
if (dataUpdated) {
pageField.setModifiedOn(Instant.now(Clock.systemUTC()));
}
return pageField;
}).subscribe();
或者我应该在flux的映射操作中使用java流。我有时觉得,就在java 8出现之后,我们又看到了同样的“想把流用于所有事情”的思维模式,但是使用了Reactor/RXJava 我应该在flux或mono map操作中使用java流来遍历和操作数据吗
Flux.fromIterable(page.getPageFieldData()).subscribeOn(Schedulers.elastic()).map(pageField - > {
clientDataMono.subscribeOn(Schedulers.elastic()).map(clientData - > {
Flux.fromIterable(clientData.getPageFieldData())
.filter(clientPageField - > clientPageField.getId() == pageField.getId())
.subscribeOn(Schedulers.elastic()).map(field - > {
dataUpdated = true;
pageField.setData(field.getData());
return field;
}).subscribe();
return clientData;
}).subscribe();
if (dataUpdated) {
pageField.setModifiedOn(Instant.now(Clock.systemUTC()));
}
return pageField;
}).subscribe();
简单的回答是,如果您可以明智地使用Java流,而Reactor在这种情况下没有任何优势,那么就没有理由使用Reactor。当用例需要Reactor/reactive编程时,Reactor/reactive编程非常棒,但是请记住,它是一个外部库(没有捆绑在核心JRE中),它要复杂得多,并且比标准Java流更难被普遍理解
反应堆当然要强大得多。如果您需要控制生成值的速度、背压、详细的发布者/订阅者行为、多播、缓存、重试等,或者您将来可能需要控制,那么每次都会轻松获胜
但是,如果你只是在过滤和映射一个现有的Java集合,就像你在那个例子中看到的那样,reactor不能提供任何改进,我看不出有什么理由不使用标准Java流。我看不出有任何理由认为这个例子应该使用
Flux
你永远不应该在自己的应用程序中订阅。客户机订阅了您的服务,而应用程序本身并不订阅自己。实际上,我有两个包含列表的对象,一个对象通过json来自客户机,另一个来自数据库(被动)。我所需要做的就是比较这两个对象&从数据库中更改对象中的数据。完成所有这些处理后,将对象保存回数据库。由于数据库是被动的,一旦数据库中的“我的对象”被填满,它就会开始发布&所有的比较都会在不等待整个对象的情况下进行,但是对于Java streams,这是不可能的,因为它会在开始过滤和处理之前等待整个对象。