将最新值与最后n个值组合

时间:2018-05-15 16:13:34

标签: rx-java reactive-programming rx-java2

我正在尝试创建一个响应式管道,它会在4x3 matrix keypad上输入字符(0-9,*,#)并将其显示在4-digit, seven-segment display上。这是针对每个发出的新项目,我需要将它与之前的n = 3值组合。

到目前为止,我已经在Keypad控制器类中公开了PublishSubject<Character> keypresses。但是,此类会发出所有键按下。也就是说,即使您只按一个键(例如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位数,比如2000ms。

0 个答案:

没有答案