可以将反应性代码(即Mono和Flux对象)与Java 8流一起使用作为反应性流吗?

时间:2019-07-25 13:32:05

标签: java spring-boot reactive-programming project-reactor

我有两个对象,每个对象中都包含列表,我的整个spring boot项目都使用项目反应器构造。我是否应该在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();

或者我应该在助焊剂的map操作内部使用java流。

1 个答案:

答案 0 :(得分:4)

有时候,我感觉就像在Java 8出现之后,我们使用Reactor / RXJava一样,正在重新思考同样的“想要为所有内容使用流”的思想。

  

我应该在flux或mono map操作中使用java流进行数据遍历吗?

简短的答案是,如果您可以明智地使用Java流,并且Reactor在这种情况下没有任何优势,那么就没有理由使用Reactor。当用例需要时,Reactor /反应式编程非常棒,但是请记住,它是一个外部库(未捆绑在核心JRE中),它比标准Java流更复杂,并且不那么容易理解。

反应器当然要强大得多。如果您需要控制产生值的速度,背压,详细的发布者/订阅者行为,多播,缓存,重试等,或者在将来可行,那么每次都将放手。

但是,如果您实际上只是过滤和映射一个现有的Java集合(如您在该示例中所看到的那样),那么Reactor无法提供任何改进,我认为没有充分的理由不使用标准Java流。