我尝试使用java反应式扩展来构建一个简单的应用程序。我有两个连续发出温度值的流,我想检测并滤除可能出现错误的感应温度峰值,这样做我需要考虑先例值,以便我可以考虑到这样的变化:
我仍然无法在文档中找到合适的操作符。有谁知道我该如何完成任务?我应该制作一个自定义操作员吗?
这些是我的流:
double min = 50, max = 75, spikeFreq = 0.01;
Observable<Double> tempStream1 = Observable.create((
Subscriber<? super Double> subscriber) -> {
new TempStream(subscriber, min, max, spikeFreq).start();
});
Observable<Double> tempStream2 = Observable.create((
Subscriber<? super Double> subscriber) -> {
new TempStream(subscriber, min, max, spikeFreq).start();
});
public class TempStream extends Thread{
private Subscriber<? super Double> subscriber;
private TempSensor sensor;
public TempStream(Subscriber<? super Double> subscriber, double min,
double max, double spikeFreq) {
this.subscriber = subscriber;
sensor = new TempSensor(min, max, spikeFreq);
}
@Override
public void run() {
Random gen = new Random(System.currentTimeMillis());
while (!subscriber.isUnsubscribed()) {
try {
subscriber.onNext(sensor.getCurrentValue());
Thread.sleep(1000 + gen.nextInt() % 1000);
} catch (Exception ex) {
subscriber.onError(ex);
}
}
subscriber.onCompleted();
}
}
答案 0 :(得分:10)
在这种情况下,buffer
运算符(http://reactivex.io/documentation/operators/buffer.html)可能会有所帮助。
您希望将buffer
与count = 2
和skip = 1
一起使用。这样你就可以获得前瞻性的#34;流中的一个元素。
E.g:
stream.buffer(2,1).filter(buf -> buf.size() == 2 && buf.get(0) - buf.get(1) < max);
请注意,此示例还会检查是否缓冲了两个值,因为在完成流时只会发出一个值。