首页 > 解决方案 > 将最新值与最后 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()

其方法看起来很有前途ReplaySubjectcreateWithTimeAndSize因为它最多保留给定数量的项目,这些项目也不超过指定的时间量。然而,这种行为只在订阅时表现出来,之后观察者从那一刻开始不断地接收。有没有办法让 ReplaySubject - 或其他一些 rxjava 类/方法 - 在指定的时间内连续输出最新的 4 位数字,比如 2000 毫秒。

标签: rx-javareactive-programmingrx-java2

解决方案


推荐阅读