Обеспечить поток, чтобы сигнализировать события без конкретного значения? - PullRequest
1 голос
/ 28 февраля 2020

Как настроить поток / издателя с проектом Reactor , который генерирует события с течением времени, но без каких-либо конкретных значений. Я думал о Flux<Void>, но в документации упоминается, что Flux<Void> - пустой поток.

Например, я использую поток с изменениями файловой системы Flux<Path>. Мне не нужно значение Path, но я хочу добавить другие события. Для этого мне нужно создать фиктивные Path объекты.

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

Можно ли избежать фиктивных значений или, может быть, существует соглашение express о том, что значения не читаются?

1 Ответ

2 голосов
/ 28 февраля 2020

Реактивные потоки работают только с объектами (вы никогда не можете передавать null), и, поскольку Void никогда не может быть создан, вы никогда не сможете отправлять какие-либо значения - только сигнал завершения.

Я не совсем уверен в случае использования здесь, но есть два разных подхода, которые вы можете вспомнить этой весной:

  • Если вам никогда не нужно значение, Вы можете просто сопоставить Object, то есть

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

    Затем вы можете просто использовать events.startWith(new Object()) и продолжить. (Вы можете выбрать более подходящий тип, чем Object, если хотите, или создать свой собственный.)

  • Если вам нужны фактические значения, но иногда нужно просто вставить ваши собственные "фиктивные" значения, тогда вы можете иметь поток Optional<Path> вместо этого:

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

    Тогда вы можете сделать events.startWith(Optional.empty()), чтобы добавить "фиктивный" путь к потоку.

FWIW, второй подход, который я часто использовал для функций типа «сердцебиение», где я хочу, чтобы был выдан поток значений, но также хочу, чтобы активность сохранялась один раз в каждый (временной период) для сохранения Основная связь жива. Во втором случае я часто использую пустые опции.

...