rx-java - 将最新值与最后 n 个值组合
问题描述
我正在尝试创建一个反应式管道,该管道接受在4x3 矩阵键盘上输入的字符 (0-9, *, #)并将它们显示在4 位七段显示器上。也就是说,对于每一个发出的新项目,我都需要将它与之前的 n=3 值结合起来。
到目前为止,我已经PublishSubject<Character> keypresses
在 Keypad 控制器类中公开了一个。但是,此类会发出所有按键。也就是说,即使您只按下一个键(例如 1),也会发出多个 1。所以我使用debounce
运算符来确保Character
每次按键只发出一个:
KeypadController kbc = new KeypadController();
kbc.keypresses.debounce(250, TimeUnit.MILLISECONDS)
.subscribe(c -> {System.out.println(c);});
到目前为止,一切都很好。在光谱的另一端,我有 4 位七段显示控制器类。这个类公开了一个writeDigit(int position, char value)
和一个clearScreen()
方法。也就是说,如果我想显示数字 7654,我需要调用该方法四次:
SevenSegmentController segment = new SevenSegmentController();
segment.writeDigit(3,'7')
segment.writeDigit(2,'6')
segment.writeDigit(1,'5')
segment.writeDigit(0,'4')
但是,我希望显示随着用户输入数字而不断更新。如以下场景所示。
user presses 7
|----| segment.writeDigit(0,'7')
| 7|
|----|
user presses 6
|----| segment.writeDigit(1,'7')
| 76| segment.writeDigit(0,'6')
|----|
user presses 5
|----| segment.writeDigit(2,'7')
| 765| segment.writeDigit(1,'6')
|----| segment.writeDigit(0,'5')
user presses 4
|----| segment.writeDigit(3,'7')
|7654| segment.writeDigit(2,'6')
|----| segment.writeDigit(1,'5')
segment.writeDigit(0,'4')
Finally,
|----| Display clears after timeout (1000ms without input)
| | or if user presses 5th key
|----| segment.clearScreen()
其方法看起来很有前途ReplaySubject
,createWithTimeAndSize
因为它最多保留给定数量的项目,这些项目也不超过指定的时间量。然而,这种行为只在订阅时表现出来,之后观察者从那一刻开始不断地接收。有没有办法让 ReplaySubject - 或其他一些 rxjava 类/方法 - 在指定的时间内连续输出最新的 4 位数字,比如 2000 毫秒。
解决方案
推荐阅读
- windows - 在 Windows dockerfile 中,如何将 ARG 值传递给 RUN 命令?
- r - 添加考虑日期的列值
- asp.net - 根据下拉列表 ASP.NET (VB) 更改连接字符串
- python - 有没有办法在python中设置pdf的标题和作者元数据属性?
- .net - 正则表达式匹配多行字符串中的字符串
- powershell - Powershell - 如何替换扩展名以外的文件上的点
- python - 使用 spark.sparkContext.addPyFile 导入 Pandas UDF
- ios - SwiftUI有条件显示的按钮在按住单独的LongPressGesture“Shift”按钮时忽略第一次点击
- python - 如何使用 Tesseract 识别图像上两个数字之间的斜线?
- python - 错误:无法使用 sympy 获得拉普拉斯逆变换表达式