Я хочу иметь возможность распознавать кратность щелчков.
На последнем этапе есть Конвейер Flux:
Код: Выделить всё
final Flux buttonStream = stateStream.getButtonFlux()
.mapNotNull(GamepadIntrospector::introspect)
.filter(Predicate.not(List::isEmpty))
.map(EventMapper::translateButtonTimed)
.filter(notFizzy)
;
Код: Выделить всё
01:08:09.696 [pool-1-thread-1] INFO org.asmus.Main -- QualifiedEType(type=A, pressType=CLICK)
01:08:09.873 [pool-1-thread-1] INFO org.asmus.Main -- QualifiedEType(type=A, pressType=DOUBLE)
01:08:10.016 [pool-1-thread-1] INFO org.asmus.Main -- QualifiedEType(type=A, pressType=TRIPLE)
Что мне нужно, чтобы этот конвейер решил, так это иметь только последнее событие на выходе.
Мне не нужна выборка временных интервалов, которая начиналась бы при запуске программы, чтобы выполнить выборку и получить последнюю за этот промежуток времени; Думаю, это можно сделать так:
Код: Выделить всё
final Flux buttonStream = stateStream.getButtonFlux()
.mapNotNull(GamepadIntrospector::introspect)
.filter(Predicate.not(List::isEmpty))
.map(EventMapper::translateButtonTimed)
.filter(notFizzy)
.bufferTimeout(3, Duration.ofMillis(300))
.map(e -> e.size() == 1 ?
e.getFirst() : e.getLast())
;
Я бы хотел, чтобы этот конвейер ждал некоторое время, скажем, 80 мс, после получения первого события, и если больше ничего не происходит, он генерирует событие (оно кратность уже будет установлена вышеупомянутым компонентом картографа); если в течение этого временного диапазона поступает дополнительный, он излучает последний из этой цепочки и так далее.
Поэтому после трехкратного нажатия кнопки «A» я хочу получить только
Код: Выделить всё
01:08:10.016 [pool-1-thread-1] INFO org.asmus.Main -- QualifiedEType(type=A, pressType=TRIPLE)
Кроме того, эта цепочка должна учитывать тип кнопки, поэтому время QualifiedEType(type=A, pressType=...) не может мешать QualifiedEType(type=X, pressType=...)
Как это можно сделать? В идеале была бы какая-нибудь умная цепочка операторов Flux, но подойдет все что угодно...
io.projectreactor:reactor-core:3.6.5
Спасибо!
Подробнее здесь: https://stackoverflow.com/questions/793 ... ltiplicity
Мобильная версия