提供 Flux 来指示没有具体值的事件?

Provide Flux to signal events without a concrete value?

如何使用项目 Reactor that emits events over time but without any concrete values. I thought about Flux<Void> but the documentation 设置 stream/publisher 提到 Flux<Void> 是一个空流。

例如,我使用文件系统更改的流 Flux<Path>。我不需要 Path 值但想添加其他事件。为此,我必须创建虚拟 Path 对象。

Flux<Path> events = getFilesystemChanges();
events.startWith(Path.of("dummy"))
      .map(e -> 42 /* subsequent operator ignores the emitted value */)
      ...

是否可以避免使用虚拟值,或者是否有一种约定来表示这些值未被读取?

Reactive 流仅适用于对象(您永远无法流式传输 null),并且由于 Void 永远无法实例化,因此您永远无法发送任何值 - 只是一个完成信号。

我不太确定这里的用例,但是您可以考虑两种不同的方法 spring:

  • 如果您永远不需要该值,您可以只映射到 Object,即

    Flux<Object> events = getFilesystemChanges().map(p -> new Object());
    

    然后您可以使用 events.startWith(new Object()) 继续。 (如果您愿意,您当然可以选择比 Object 更合适的类型,或者创建您自己的类型。)

  • 如果您需要发出的实际值,但有时只需要插入您自己的 "dummy" 值,那么您可以使用 Optional<Path> 流:

    Flux<Optional<Path>> events = getFilesystemChanges().map(Optional::of);
    

    然后你可以events.startWith(Optional.empty())为流添加一个"dummy"路径。

FWIW,我经常用于 "heartbeat" 类型函数的第二种方法,我希望在其中发出一个值流,但也希望确保每个 activity 一次(时间段) 以保持底层连接处于活动状态。后者是我经常使用空可选值的地方。

不确定这是否是您要查找的内容,但您是否尝试过 Flux.just(Optional.empty())?