Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用混合反应式代码,即Mono和amp;Flux对象是反应流以及Java8流_Java_Spring Boot_Reactive Programming_Project Reactor - Fatal编程技术网

使用混合反应式代码,即Mono和amp;Flux对象是反应流以及Java8流

使用混合反应式代码,即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

我有两个对象,每个对象都包含一个列表,我的整个spring引导项目都使用ProjectReactor构造。我应该在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();

或者我应该在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,这是不可能的,因为它会在开始过滤和处理之前等待整个对象。