Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.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
Java 如何从通量中的项目生成项目(弹簧反应器)_Java_Spring_Spring Boot_Project Reactor_Reactor - Fatal编程技术网

Java 如何从通量中的项目生成项目(弹簧反应器)

Java 如何从通量中的项目生成项目(弹簧反应器),java,spring,spring-boot,project-reactor,reactor,Java,Spring,Spring Boot,Project Reactor,Reactor,我如何用反应堆通量模拟下面的场景 +-------+ +-------+ +-------+ | | | | -----> | | | A | ----> | B | -----> | C | | | | | -----> | | +-------+ +-------+ +

我如何用反应堆通量模拟下面的场景

  +-------+        +-------+        +-------+
  |       |        |       | -----> |       |
  |   A   | ---->  |   B   | -----> |   C   |
  |       |        |       | -----> |       |
  +-------+        +-------+        +-------+
A
生成由
B
接收的项目,该项目将发出
[0..N]
C
接收的项目

如何编写流量,以便
B
可以基于
A
发出的项目发出新项目

A a = ...
B b = ...
C c = ...

Flux.push((emitter) -> a.run(emitter))
 .howToMapOneEelementToMany((emitter, item) -> b.handle(emitter, item); // ???
 .doOnNext((item) -> c.handle(item))
 .subscribe();

编辑:示例

  • A
    生成Excel文件的路径
  • B
    读取Excel文件中的数据,并每行生成一项(可以是很多行,也可以是无行)
  • C
    将每一行存储在数据库中

    • 根据@sfiss
      flatMap
      的推荐,这似乎是一个不错的选择

      ExcelFilePathReaderSink pathReader = ...
      ExcelRowHandlerSink rowHandler = ...
      OutputWriter outWriter = ...
      
      Flux.push(pathReader)     // A
        .flatMap(rowHandler)    // B
        .doOnNext(outWriter)    // C
        .subscribe();
      

      如果你有很多文件,那么已经是一个通量。你可以做一个平面图,用这个,每一个通量项目都会生成另一个通量行。 如果要保持数据的顺序,还有其他方法,如concatMap和flatMapSequential

       public Flux<String> someMethod() {
      
          return Flux.fromIterable(List.of("excelFileData", "excelFileData2"))
            .flatMap(this::getRows);
      
        }
      
        private Flux<String> getRows(String file) {
          return Flux.fromIterable(file.lines().collect(toList()));
        }
      
      public方法(){
      返回Flux.fromIterable(列表中的(“excelFileData”、“excelFileData2”))
      .flatMap(this::getRows);
      }
      私有流量getRows(字符串文件){
      返回Flux.fromIterable(file.lines().collect(toList());
      }
      
      见反应堆文件,相当不错

      但是如果你想把单声道转换成通量,你可以这样做:

      public Flux<String> someMethod() {
      
        return Mono.just("excelFileData")
          .flatMapMany(this::getRows);
      
      }
      
      private Flux<String> getRows(String file) {
        return Flux.fromIterable(file.lines().collect(toList()));
      }
      
      
      public方法(){
      返回Mono.just(“excelFileData”)
      .flatMapMany(此::getRows);
      }
      私有流量getRows(字符串文件){
      返回Flux.fromIterable(file.lines().collect(toList());
      }
      
      也许吧。很多?平面地图@sfiss有趣的是,在不知道将创建多少新项目的情况下,如何使用它?例如,它可以与
      Flux.push
      或类似工具一起使用吗?对于您所要求的内容,还不太清楚,因为您的代码示例与您所要求的并不完全匹配。你写
      每行生成一个项目
      ,然后你就有了一个
      如何从一个项目生成一个项目
      我想这篇博文会给你你需要的答案